Bài 7
Nhng chc năng Đối Tượng mi ca VB.NET (phn
IV)
Dùng OO trong VB.NET
Shared class members ( Các thành viên để dùng chung ca class)
Mc dù Object rt hiu năng và hu ích, có khi ta ch mun truy cp các variables hay
methods ca mt class đ làm vic mà không cn phi instantiate mt Object nào c.
Tc là y như trong quá kh, khi viết VB6, ta dùng các variables hay methods ca mt
BAS Module. Đại khái ging như thay vì ký giao kèo vi mt thu (Object) để thc
hin mt công trình, ta ch mun mướn th hay chuyên viên làm vic gia công ( gi
các methods) thôi.
Shared Methods
Trong VB.NET chng nhng mt Class có các methods và properties thông thường
như ta đã thy - tc là nhng methods và properties ca mt Object ta có th dùng
ngay sau khi Object y thành hình qua quá trình instantiation - mà còn có các
methods và properties ta có th dùng mà không cn phi to ra mt instance nào t
Class. Chúng được gi là shared methods. ( Trong các ngôn ng lp trình khác các
methods ny còn được gi là static methods hay class methods).
Ta không th truy cp mt shared method qua mt Object như method bình thường,
nhưng phi dùng trc tiếp tên ca class. Thí d sau đây s minh ha điu ny:
Public Class Math
Shared Function Add( ByVal x As Single, ByVal y As Single) As Single
Return x + y
End Function
End Class
Sau khi định nghĩa Class Math, ta có th dùng Shared Function Add mà không cn
instantiate mt Object thuc class Math như sau:
Dim Result As Single
result = Math.Add(12.5, 36.8)
Để ý thay vì dùng mt object variable ta dùng thng tên ca class Math để truy cp
method Add. Vi mt method bình thường thì làm như thế s b syntax error, nhưng
trong trường hp ny thì không sao.
Ta cũng có th overload shared methods, tc là có th code nhiu shared methods
vi cùng mt tên nhưng có nhng parameter lists khác nhau.
Phm vi hot động bình thường (Default Scope) ca shared methods là Public. Tuy
nhiên ta có th gii hn vic truy cp chúng bng cách dùng nhng Access Modifiers
như Friend, Protected hay Private. Tht ra khi overloading mt shared method ta có
th dùng nhng scopes khác nhau cho mi shared method.
Có mt thí d v shared method t .NET system class libraries. Để m mt text file
theo mode input, đin hình ta dùng shared method trong File class như sau:
Dim inFile As StreamReader = File.OpenText("words.txt")
Dim strIn As String
strIn = inFile.ReadLine()
đây không có object File nào được to ra. Method OpenText là mt shared
Function, nó m input text file words.txt và cho ta mt object loi StreamReader tên
inFile để ta dùng sau đó.
Shared Variables
Đôi khi ta mun tt c objects ca cùng mt class đều dùng chung mt variable. Ta có
th thc hin vic y vi shared variables.
Mt shared variable được khai báo vi keyword shared ging như shared method:
Public Class MyCounter
Private Shared mintCount As Integer
End Class
Ta có th cho shared variable mt scope Public hay Private tùy ý, nhưng By Default,
scope ca shared variables là Private, khác vi shared methods thì By Default là
Public.
Đim quan trng ca shared variables là chúng được dùng chung gia mi instances
(objects) ca cùng mt class. Dưới đây là mt thí d trong đó ta gi cái counter có tr
s tăng thêm 1 mi ln có mt instance mi ca class MyCounter. Bt c lúc nào ta
cũng có th biết có bao nhiêu objects đã được to ra bng cách đọc property Count:
Public Class MyCounter
Private Shared mintCount As Integer
Public Sub New()
mintCount += 1
End Sub
Public ReadOnly Property Count() As Integer
Get
Return mintCount
End Get
End Property
End Class
Như thế, nếu ta chy client code dưới đây nó s hin th kết qu là 3:
Protected Sub Button1_Click( ByVal sender As Object, ByVal e As
System.EventArgs) Handles Button1.Click
Dim obj As MyCounter
obj = New MyCounter()
obj = New MyCounter()
obj = New MyCounter()
MsgBox(obj.Count, MsgBoxStyle.Information, "Counter")
End Sub
Nếu ta chy code thêm hai ln na, ta s có 6 và 9. H ta còn chy chương trình thì
cái counter còn làm vic. Khi ta chm dt chương trình thì cái counter s biến mt.
Bn có th Download source code ca program ny ti đây.
Global values
Mt cách dùng rt thông dng khác ca shared variable là xem nó như mt loi
Global variable. Khi dùng scope Public ta s có mt dng tương đương vi VB6
Global variable trong mt BAS Module. Thí d như:
Public Class GlobalData
Public Shared TotalCost As Single
End Class
Sau đó ta có th dùng variable ny khp nơi trong client code:
GlobalData.TotalCost += 45.60
Events
Raising Event đ x lý trong mt Project khác
VB.NET không h tr Events t đời cha đến đời con theo đúng nguyên tc tha kế.
Nếu mt BaseClass định nghĩa mt Public Event thì ta ch có th raise event y trong
code ca BaseClass thôi ch không th raise event y trong SubClass nào ca
BaseClass y.
Khác vi methods, ta không th overload mt Event, tc là không th dùng mt tên
cho hai Events có parameter list khác nhau.
Ta có th to mt Class Library Project vi mt Class trong đó có raise mt Event ri
to mt project khác trong đó có code để đón nhn và x lý Event y.
Để th vic ny bn hãy to mt Class Library Project mi vi tên ClassLibrary1 v
viết nhng dòng code định nghĩa Class Class1 vi Event TheEvent và Sub
LàmVic để raise Event như sau:
Public Class Class1
Public Event TheEvent()
Public Sub LàmVi c()
RaiseEvent TheEvent()
End Sub
End Class
Kế đó bn dùng Menu command File | Add Project | New Project để thêm mt
project mi vi tên EventClass. Để có th dùng Class1, bn cn phi reference nó
vi Menu command Project | Add Reference..., chn Tab Projects và click Browse
để chn ClassLibrary1.DLL t subfolder ClassLibrary1\bin ca solution như trong
hình dưới đây:
Mt khi đã referenced ClassLibrary1 vi Class1 trong y, bây gi bn có th
doubleclick lên Form1 để code như sau:
Private WithEvents obj As ClassLibrary1.Class1
Private Sub Form1_Load( ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
obj = New ClassLibrary1.Class1()
End Sub
Nh là ta phi declare variable obj thuc loi ClassLibrary1.Class1 vi WithEvents.
Đặt mt Button tên BtnLàmVic và doubleclick lên nó để code như sau:
Private Sub BtnLàmVi c_Click( ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles
BtnLàmVi c.Click
obj.LàmVi c()
End Sub
Để x lý Event ca obj bn chn tên t combobox phía trên bên trái, ri chn
TheEvent t combobox bên phi như trong hình dưới đây:
đây ta handle Event bng cách hin th mt message đơn gin: Đang x lý mt
Event t Class1. Bây gi bn có th chy program. Khi bn click Button BtnLàmVic
program s hin th message để chng minh rng t mt Application ta có th handle
event trong Class ca mt Project khác.