Các bài tập Microsoft .NET 82
Bà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
Các bài tập Microsoft .NET 83
Private Function CalculateAmount() As Single
vậy biểu tôi lén lấy hai trái xoài để ăn vụn. Vì không phải là người nhà
nê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
Các bài tập Microsoft .NET 85
Tuy nhiên, hãy xem trường hợp ta code như sau:
Private Sub BtnParentClassObject_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles BtnParentClassObject.Click
Dim obj As ClassCha
obj = New ClassCon()
obj.ChàoHỏi()
End Sub
Trước hết, ở đây có vẻ kỳ kỳ, tại sao declare một variable loại ClassCha
mà lại instantiate một object ClassCon. Chuyện đó hoàn toàn bình
thường, vì ClassCon là một ClassCha. Tức là một variable loại ClassCha
hay ClassCon đều có thể chứa, thật ra là hold references to (point to, chỉ
tới), một instance của ClassCon.
Điểm này áp dụng tổng quát khi ta dùng Inheritance. Một variable loại
SuperClass có thể hold reference to bất cứ SubClass Object nào thừa kế
từ SuperClass ấy. Đó là một cách để ta implement tính đa dạng
(polymorphism).
Đều có thể làm ta ngạc nhiên là khi ta click button BtnParentClassObject
ta cũng thấy hiển thị message " Thưa các Bác".