Bài 6
Nhng chc năng Đối Tượng mi ca VB.NET (phn
III)
Dùng OO trong VB.NET
Ngăn cn Tha kế
Bình thường (By default) class nào cũng có th được dùng làm base class để t đó ta
tha kế. Nhưng đôi khi ta không mun cho ai tha kế t mt Class nào đó, đ làm vic
y ta dùng keyword NotInheritable khi declare class:
Public NotInheritable Class KhôngCon
End Class
Khi ta đã dùng keyword NotInheritable ri thì không class nào có th dùng keyword
Inherits để to mt subclass t class y.
Tha kế và Phm vi hot đng
Khi ta dùng đặc tính tha kế để to mt SubClass thì class mi ny có đủ mi
methods, propertes và variables vi Access Modifier Public hay Friend ca
SuperClass. Bt c th gì declared là Private trong SuperClass thì SubClass không
thy hay dùng được.
Có mt ngoi l là New method. Các Constructor methods cn phi được
implemented (đnh nghĩa)
li trong mi SubClass. Mt chc na ta s bàn vào chi tiết v đim ny.
Để làm sáng t vn đề SubClass có th dùng Class Members nào ca SuperClass, ta
th code li Function Amount trong LineItem class bng cách khiến nó gi mt
Private Function tên CalculateAmount để tính ra Amount thay vì để nó tính trc tiếp
như trước đây:
Public Function Amount() As Single
Return CalculateAmount
End Function
Private Function CalculateAmount() As Single
Return mintQuantity * msngPrice
End Function
Khi ta SubClass LineItem để to ra ServiceLine class, bt c Object ServiceLine nào
cũng tha kế Function Amount vì Function y được declared Public trong BaseClass
LineItem. Ngược li, vì Function CalculateAmount là Private nên c ServiceLine class
ln bt c client code nào dùng mt LineItem Object đều không truy cp nó được.
Như thế, mc du ta gi Function Amount được, nhưng đến phiên nó gi Private
Function CalculateAmount thì có b tr ngi không? Không sao c. Vì Function
Amount nm trong cùng Class vi Private Function CalculateAmount nên nó có th
gi được, dù rng ta gi Function Amount t ServiceLine hay client code.
Thí d trong client code ta có nhng 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 hin th trong message box, cho thy Function CalculateAmount
được Function Amount gi dùm cho client code dù rng c client code ln ServiceLine
code đều không th gi trc tiếp được.
Đim ny nhc tôi nh li khi còn bé, có ln bà con trong vườn đem ra ch cho ba má
tôi c thúng xoài thơm rt ngon. Bn tôi li xóm thy vy biu tôi lén ly hai trái xoài
để ăn vn. Vì không phi là người nhà nên bn tôi không th ly đuc xoài, bi Access
Modifier ca thún xoài là Private trong nhà tôi. Nhưng vì tôi là Public, nên bn tôi có
th nh tôi ly 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 gii hn trong class, ngược li 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 mun mt class member ch có th được dùng trong subclasses
thôi, ch không cho client code dùng. Trong trường hp 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 vi Protected Field Disn. Không có client
code nào có th thy Field DiSn được. Thế nhưng bt c SubClass nào ca
FatherClass cũng đều tha kế và dùng được DiSn.
Trong thí d trên, mt ln na SubClass có mt Public method (ChiaCa) có th
return mt protected value - nhưng chính value y, DiSn, không trc tiếp cho phép
client code dùng.
Overriding Methods
Chúng ta biết rng đặc tính quan trng ca Inheritance là mt SubClass chng nhng
tha kế behaviours ca ParentClass mà còn có th override (ln quyn) các
behaviours y na. Chúng ta đã thy mt SubClass có th extend (thêm ra)
ParentClass bng cách cho thêm các methods Public, Protected và Friend. Hơn na,
khi dùng overriding, mt SubClass có th alter (sa đi) behaviours ca 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 vi 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 to mt SubClass, nếu mun ta có th override behaviour ca Sub
ChàoHi bng 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 hin th message dialog dưới đây:
Virtual Methods
Tuy nhiên, hãy xem trường hp 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, ti sao declare mt variable loi ClassCha mà li
instantiate mt object ClassCon. Chuyn đó hoàn toàn bình thường, vì ClassCon là
mt ClassCha. Tc là mt variable loi ClassCha hay ClassCon đều có th cha, tht
ra là hold references to (point to, ch ti), mt instance ca ClassCon.
Đim ny áp dng tng quát khi ta dùng Inheritance. Mt variable loi SuperClass có
th hold reference to bt c SubClass Object nào tha kế t SuperClass y. Đó là mt
cách để ta implement tính đa dng (polymorphism).
Đều có th làm ta ngc nhiên là khi ta click button BtnParentClassObject ta cũng thy
hin th message " Thưa các Bác".
Sao l vy? Variable obj được declared là ClassCha ti sao message không phi là
"Chào các cháu"? Lý do là Sub ChàoHi ca ClassCon được gi thay vì Sub
ChàoHi ca ClassCha. Ta nói Sub ChàoHi là Virtual method. Tt c methods trong
VB.NET đều là virtual.
Ý nim virtual để nói rng cái implementation ca con cháu tr nht trong dòng h
được dùng - không cn biết là variable có data type là class ca thế h nào trong
dòng h. Tc là, nếu variable dùng trong client code hold references to ClassÔngNi,
ClassCha, ClassCon hay ClassCháu thì method trong ClassCháu được gi. Nếu trong
ClassCháu không có implementation ca method thì ta gi method trong ClassCon,
nếu không có thì gi method trong ClassCha .v.v.. theo th t t b dưới lên b trên.
Bn có th Download source code ca program ny ti đây.
Keyword Me
Keyword Me được dùng khi ta mun nói rõ (explicitly) rng ta mun dùng method ca
chính cái Class đang cha code y, ch không phi mt implementation nào khác ca
method y.
Cũng có trường hp ta phi dùng keyword Me để nói ta mun dùng class-level
variable ch không phi procedure-level variable có cùng tên. Mt procedure-level
variable, tc là local variable ca mt method, có cùng tên vi mt class-level variable
được gi là shadowed variable. Thí d:
Public Class TheClass
Private strName As String
Public Sub DoSomething()
Dim strName As String
strName = "Quang"
End Sub
End Class