Ta code Class ServiceLine như sau: Public Class ServiceLine Inherits LineItem Private mdtDateProvided As Date Public Sub New ' Make 1 as default number of services of this kind for i
Trang 1End Sub
Trong code bên trên ta dùng cả property Item của Class LineItem lẫn property Description của Class ProductLine Cả hai đều là property của ProductLine vì nó là một SubClass của LineItem
Giống như vậy, một ServiceLine có thể có ghi ngày giờ cung cấp service
Ta code Class ServiceLine như sau:
Public Class ServiceLine
Inherits LineItem
Private mdtDateProvided As Date
Public Sub New()
' Make 1 as default number of services of this kind for invoice
Quantity = 1
End Sub
Public Property DateProvided() As Date
Get
Return mdtDateProvided
End Get
Set ( ByVal Value As Date )
mdtDateProvided = Value
End Set
End Property
End Class
Một lần nữa ta dùng Statement Inherits để nói rằng ServiceLine là một
SubClass của LineItem Ta thêm property DateProvided vào interface
thừa kế từ Class LineItem
Trang 2Bài 6 Những chức năng Đối Tượng mới của VB.NET
(phần III)
Dùng OO trong VB.NET
Ngăn cản Thừa kế
Bình thường (By default) class nào cũng có thể được dùng làm base class
để từ đó ta thừa kế Nhưng đôi khi ta không muốn cho ai thừa kế từ một
Class nào đó, để làm việc ấy ta dùng keyword NotInheritable khi declare
class:
Public NotInheritable Class KhôngCon
End Class
Khi ta đã dùng keyword NotInheritable rồi thì không class nào có thể
dùng keyword Inherits để tạo một subclass từ class ấy.
Thừa kế và Phạm vi hoạt động
Khi ta dùng đặc tính thừa kế để tạo một SubClass thì class mới này có đủ
mọi methods, propertỉes và variables với Access Modifier Public hay Friend của SuperClass Bất cứ thứ gì declared là Private trong
SuperClass thì SubClass không thấy hay dùng được
Có một ngoại lệ là New method Các Constructor methods cần phải được
implemented (định nghĩa) lại trong mỗi SubClass Một chốc nữa ta sẽ bàn vào chi tiết về điểm này.
Để làm sáng tỏ vấn đề SubClass có thể dùng Class Members nào của
SuperClass, ta thử code lại Function Amount trong LineItem class bằng cách khiến nó gọi một Private Function tên CalculateAmount để tính ra
Amount thay vì để nó tính trực tiếp như trước đây:
Public Function Amount() As Single
Return CalculateAmount
End Function
Trang 3Private Function CalculateAmount() As Single
Return mintQuantity * msngPrice
End Function
Khi ta SubClass LineItem để tạo ra ServiceLine class, bất cứ Object ServiceLine nào cũng thừa kế Function Amount vì Function ấy được declared Public trong BaseClass LineItem Ngược lại, vì Function CalculateAmount là Private nên cả ServiceLine class lẫn bất cứ client code nào dùng một LineItem Object đều không truy cập nó được
Như thế, mặc dầu ta gọi Function Amount được, nhưng đến phiên nó gọi Private Function CalculateAmount thì có bị trở ngại không? Không sao
cả Vì Function Amount nằm trong cùng Class với Private Function CalculateAmount nên nó có thể gọi được, dù rằng ta gọi Function Amount từ ServiceLine hay client code
Thí dụ trong client code ta có những hàng code như sau:
Protected Sub BtnShowAmount_Click( ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles BtnShowAmount.Click
Dim Service As ServiceLine
Service = New ServiceLine()
Service.Item = "Delivery"
Service.Price = 50
Service.DateProvided = Now
MessageBox.Show (Service.Amount.ToString, "Amount", MessageBoxButtons.OK,
MessageBoxIcon.Information)
End Sub
Kết quả sẽ được hiển thị trong message box, cho thấy Function CalculateAmount được Function Amount gọi dùm cho client code dù rằng cả client code lẫn ServiceLine code đều không thể gọi trực tiếp được
Điểm này nhắc tôi nhớ lại khi còn bé, có lần bà con trong vườn đem ra chợ cho ba má tôi cả thúng xoài thơm rất ngon Bạn tôi ở lối xóm thấy
Trang 4nên bạn tôi không thể lấy đuợc xoài, bởi Access Modifier của thún xoài là Private trong nhà tôi Nhưng vì tôi là Public, nên bạn tôi có thể nhờ tôi lấy dùm
Protected Methods
Đôi khi Public hay Private thôi chưa đủ Nếu ta declare thứ gì Private thì
nó hoàn toàn giới hạn trong class, ngược lại nếu ta declare nó Public (hay Friend) thì nó có thể được dùng trong subclasses hay client code
Tuy nhiên, có lúc ta muốn một class member chỉ có thể được dùng trong subclasses thôi, chớ không cho client code dùng Trong trường hợp ấy ta
dùng keyword Protected Thí dụ:
Public Class FatherClass
Protected DiSản As Single
End Class
Public Class SonClass
Inherits FatherClass
Public Function ChiaCủa() As Single
Return Disản
End Function
End Class
Ở đây ta có BaseClass FatherClass với Protected Field Disản Không
có client code nào có thể thấy Field DiSản được Thế nhưng bất cứ SubClass nào của FatherClass cũng đều thừa kế và dùng được DiSản
Trong thí dụ trên, một lần nữa SubClass có một Public method (ChiaCủa)
có thể return một protected value - nhưng chính value ấy, DiSản, không trực tiếp cho phép client code dùng
Overriding Methods
Chúng ta biết rằng đặc tính quan trọng của Inheritance là một SubClass
chẳng những thừa kế behaviours của ParentClass mà còn có thể override
Trang 5(lấn quyền) các behaviours ấy nữa Chúng ta đã thấy một SubClass có thể
extend (thêm ra) ParentClass bằng cách cho thêm các methods Public,
Protected và Friend Hơn nữa, khi dùng overriding, một SubClass có thể
alter (sửa đổi) behaviours của các methods trong ParentClass.
Bình thường (By default), ta không thể override methods trong ParentClass trừ khi các methods ấy được declared với keyword
Overridable trong ParentClass Thí dụ:
Public Class ClassCha
Public Overridable Sub ChàoHỏi()
MessageBox.Show("Chào các cháu", "Class Cha")
End Sub
End Class
Tiếp theo, khi tạo một SubClass, nếu muốn ta có thể override behaviour
của Sub ChàoHỏi bằng cách dùng keyword Overrides như sau:
Public Class ClassCon
Inherits ClassCha
Public Overrides Sub ChàoHỏi()
MessageBox.Show("Thưa các Bác", "Class Con")
End Sub
End Class
Bây giờ ta có thể viết client code như sau:
Private Sub BtnSubClassObject_Click( ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles BtnSubClassObject.Click
Dim obj As New ClassCon()
obj.ChàoHỏi()
End Sub
Khi ta click button BtnSubClassObject program sẽ hiển thị message dialog dưới đây: