Chúng ta thường lẫn lộn giữa lớp (Class) và đối tượng (Object). Cần phân biệt lớp là một ý niệm trừu tượng, còn đối tượng là một thể hiện của lớp.
Ví dụ Class ConNgười là một ý niệm trừu tượng, nhưng NguyễnVăn A là một đối tượng cụ thể. Từ những đối tượng giống nhau, chúng ta có thể trừu tượng hóa thành một lớp đối tượng.
Tính trừu tượng cho phép chúng ta loại bỏ tính chất phức tạp của đối tượng bằng cách chỉ đưa ra các thuộc tính và phương thức cần thiết của đối tượng trong lập trình.
3.1.2 Tính bao bọc
Mỗi Class được xây dựng để thực hiện một nhóm chức năng đặc trưng của riêng Class, trong trường hợp một đối tượng thuộc Class cần thực hiện một chức năng không nằm trong khả năng vì chức năng đó thuộc về một đối tượng thuộc Class khác, nó sẽ yêu cầu đối tượng đó đảm nhận thực hiện công việc. Một điểm quan trọng trong cách giao tiếp giữa các đối tượng là một đối tượng sẽ không được truy xuất trực tiếp vào thành phần dữ liệu của đối tượng khác cũng như không đưa thành phần dữ liệu của mình cho đối tượng khác một cách trực tiếp. Tất cả mọi thao tác truy xuất vào thành phần dữ liệu từ đối tượng này qua đối tượng khác phải được thực hiện bởi các phương thức (method) của chính đối tượng chứa dữ liệu. Đây cũng chính là một tính chất quan trọng trong lập trình hướng đối tượng gọi là tính bao bọc (encapsulation) dữ liệu.
Tính bao bọc cho phép dấu thông tin của đối tượng bằng cách kết hợp thông tin vớiø các phương thức liên quan đến thông tin trong đối tượng.
Ví dụ: Xe hơi có các chức năng (phương thức phô diễn bên ngoài) như Ngừng, Chạy tới, Chạy lùi. Đây là những gì cần thiết cho Tài xế khi tương tác với Xe hơi. Xe hơi có thể có một đối tượng Động cơ nhưng Tài xế không cần phải quan tâm. Tất cả những gì cần quan tâm là những chức năng để có thể vận hành xe. Do đó, khi thay một Động cơ khác, Tài xế vẫn sử dụng các chức năng cũ để vận hành Xe hơi bao lâu các phương thức phô diễn bên ngoài (Interface) không bị thay đổi.
3.1.3 Tính kế thừa
Tính kế thừa là khả năng cho phép ta xây dựng một lớp mới dựa trên các định nghĩa của một lớp đã có. Lớp đã có gọi là lớp Cha, lớp mới phát sinh gọi là lớp Con và đương nhiên kế thừa tất cả các thành phần của lớp Cha, có thể mở rộng công năng các thành phần kế thừa cũng như bổ sung thêm các thành phần mới
3.1.4 Tính đa hình
Tính đa hình là khả năng một ngôn ngữ xử lý các đối tượng hữu quan theo cùng một cách. Tính đa hình thể hiện dưới nhiều hình thức:
59 * Kết nối trễ - Late Binding
Đây là khả năng cho phép người lập trình gọi trước một phương thức của đối tượng, tuy chưa xác định được đối tượng. Đến khi thực hiện, chương trình mới xác định được đối tượng và gọi phương thức tương ứng của đối tượng đó. Kết nối trễ giúp chương trình được uyển chuyển chỉ yêu cầu đối tượng cung cấp đúng phương thức cần thiết là đủ.
Ví dụ: Chúng ta có lớp Xe với phương thức Chạy và các lớp Xe đạp, Xe hơi, Xe đẩy cùng phát sinh từ lớp Xe.
Chúng ta chưa biết sẽ sử dụng xe gì để di chuyển vì tùy thuộc tình hình có sẵn xe nào nên gọi trước phương thức Chạy. Khi chương trình thực thi, tùy theo đối tượng của lớp nào được đưa ra mà phương thức Chạy của đối tượng đó được gọi.
* Nạp chồng - Overloading
Khả năng cho phép một lớp có nhiều thuộc tính, phương thức cùng tên nhưng với các tham số khác nhau về loại cũng như về số lượng. Khi được gọi, dựa vào tham số truyền vào, thuộc tính hay phương thức tương ứng sẽ được thực hiện.
* Ghi chồng - Overriding
Hình thức này áp dụng cho lớp Con đối với lớp Cha. Lớp Con được phép có một phương thức cùng tên, cùng số tham số có kiểu dữ liệu như phương thức của lớp Cha hoặc những lớp trước đó nữa (lớp phát sinh ra lớp Cha …) với cài đặt khác đi. Lúc thực thi, nếu lớp Con không có phương thức riêng, phương thức của lớp Cha sẽ được gọi, ngược lại nếu lớp Con có phương thức riêng thì phương thức này sẽ được gọi.
3.2 Lớp đối tượng
3.2.1 Khai báo lớp
Lớp hiểu một cách đơn giản là sự tích hợp giữa hai thành phần: thành phần dữ liệu và thành phần xử lý.
Cú pháp khai báo lớp
[AccessModifier][Keyword] Class _ ClassName [Implements InterfaceName]
'Declare properties and methods End Class
Trong đó
- AccessModifier định nghĩa khả năng truy cập của class, sử dụng một trong các từ khóa : Public, Private, Protected, Friend, Protected Friend.
- Keyword chỉ rõ các lớp có được thừa kế hay không, sử dụng một trong các từ khóa Inherit, NotInheritable hoặc MustInherit.
60 - Class đánh dấu bắt đầu một class
- Classname: tên của một class
- Implements chỉ rõ class thực thi trên giao diện nào.
- InterfaceName miêu tả tên giao diện.Một class có thể thực thi trên một hoặc nhiều giao diện.
- End Class đánh dấu kết thúc khai báo của một class
- Từ khóa để tham khảo khái niệm class trong MSDN là “Class statement”
3.2.2 Đối tượng
Đối tượng là 1 sự thể hiện của lớp. Một lớp có thể có nhiều sự thể hiện khác nhau.
Cú pháp khai báo đối tượng:
Dim variablename As [New] { objectclass | Object }
Ví dụ minh hoạ:
Dim a As new CHocSinh Dim x As new ChocSinh Dim y As new CHocSinh
Trong ví dụ trên ta nói a,x,y là 3 đối tượng thuộc class CHocSinh. Nói cách khác, trong ví dụ này, lớp CHocSinh có 3 thể hiện.
Chú ý:
- Có thể có nhiều đối tượng cùng thuộc về một lớp.
- Từ khóa để tham khảo khái niệm đối tượng trong MSDN là “object variables, declaring”
3.2.3 Phương thức
Phương thức là chức năng mà đối tượng thuộc về lớp có thể thực hiện. Đó có thể là một thủ tục hoặc một hàm.
3.2.4 Ví dụ về thiết kế lớp
Viết chương trình nhập họ tên, điểm toán, điểm văn của một học sinh. Tính điểm trung bình và xuất kết quả ra Console.
Đơn thể lớp học sinh: Public Class CHocSinh
Private HoTen As String Private Toan As Integer Private Van As Integer
Private DiemTrungBinh As Double
61 Return
End Sub
Public Sub Nhap()
Console.Write("Nhap ho ten:") HoTen = Console.ReadLine() Console.Write("Nhap toan:") Toan = Console.ReadLine() Console.Write("Nhap van:") Van = Console.ReadLine() End Sub
Public Sub XuLy()
DiemTrungBinh = (Toan + Van) / 2 End Sub
Public Sub Xuat()
Console.WriteLine("Ho ten :" & HoTen) Console.WriteLine("Toan :" & Toan) Console.WriteLine("Van:" & Van)
Console.WriteLine("Diem Trung Binh:" & DiemTrungBinh) End Sub End Class Đơn thể chính: Module Module1 Sub Main()
Dim hs As New CHocSinh hs.Nhap()
hs.XuLy() hs.Xuat() End Sub
End Module