Lập trình VB.NET - Bài 7: Những chắc năng đối tượng mới của VB.NET (phần 4)
Dùng OO trong VB.NET
Shared class members ( Các thành viên đểdùng chung của
class)
Mặc dù Object rất hiệu năng và hữu ích, có khi ta chỉmuốn truy cập các
variables hay methods của một class đểlàm việc mà không cần phải instantiate
một Object nào cả. Tức là y nhưtrong quá khứ, khi viết VB6, ta dùng các
variables hay methods của một BAS Module. Đại khái giống nhưthay vì ký giao
kèo với một thầu (Object) đểthực hiện một công trình, ta chỉmuốn mướn thợ
hay chuyên viên làm việc gia công ( gọi các methods) thôi.
)
End Sub
End Class
Nếu bạn tìm cách raise một non-shared event từ một shared method thì sẽ bị
syntax error.
Early Binding hay Late Binding (Hiệu lực Sớm hay Trễ)
Early Binding có nghĩa là program biết rõ ngay từ đầu loại Object (thuộc Class
nào) sẽ được dùng trong hoàn cảnh nào. Nó cho phép IntelliSense hiển thị cho
ta thấy những class members nào ta có thể dùng và compiler kiểm xem những
methods ta dùng có hiện hữu không. Early Binding code được compiled ra IL rất
hiệu năng vì compiler biết rõ ràng data types của các parameters.
Ngược lại Late Binding có nghĩa là ta làm việc cách linh động với một Object
lúc run-time, tức là program không biết trước Object ấy thuộc loại nào. Late
Binding cho ta sự uyển chuyển chỉ làm sao Object cung cấp đúng method cần
thiết là đủ. Do đó, ta không hưởng được sự sang trọng IntelliSense cung cấp và
compiler không thể kiểm soát loại Object trước dùm cho ta được. Mặc dầu Late
Binding code chạy chậm hơn nhưng nó cho ta sự tự do giống như khi làm việc
ngoài đời, để đến giờ chót mới xác nhận.
By Default, mọi objects trong VB.NET đều là Late Bound. Visual Studio.NET IDE
với Option Strict Off by default áp đặt luật đó. Nếu muốn áp đặt Early Binding
ta cần phải nhét câu Option Strict On ở đầu một source file.
Dùng Object Type
Ta có Late Binding khi compiler không thể xác định loại Object ta đang gọi. Ta
có thể thực hiện điều nầy bằng cách dùng Object Type để tuyên bố một cách
mơ hồ rằng ta sẽ dùng một loại Object nào đó, vì một variable với Object type có
thể hold-reference-to bất cứ một Object nào. Do đó, những dòng code sau đây
có thể được dùng cho bất cứ Object nào mà Class của nó có implement Sub
CôngTácTôi và không dùng parameter nào cả:
Option Strict Off
Module LateBind
Public Sub LàmViệc( ByVal obj As Object)
obj.CôngTácTôi()
End Sub
End Module
Nếu obj passed vào Sub LàmViệc không có một Sub CôngTácTôi chẳng dùng
parameter nào hết thì program sẽ bị error lúc run-time. Do đó, ta nên luôn luôn
dùng một Try Structure để bắt cái error đó. Thí dụ như:
Option Strict Off
Module LateBind
Public Sub LàmViệc( ByVal obj As Object)
Try
obj.CôngTácTôi()
Catch e As Exception
' Code để xử lý trường hợp Object không thích hợp
Console.WriteLine("Invalid Object passed to LàmViệc")
End Try
End Sub
End Module
Late Binding và Reflection
.NET framework hổ trợ một ý niệm gọi là reflection. Nó nói đến khả năng của
program kiểm tra .NET code để biết trong code có những thứ gì. Ta dùng
namespace System.Reflection để viết code làm chuyện ấy.
Với System.Reflection ta có thể viết code để khám phá những classes nằm trong
một assembly, để biết mỗi class có những methods, properties và events nào.
Tiếp theo đó, ta có thể dùng reflection để instantiate và dùng những objects từ
các classes ấy. Cả quá trình nầy hoàn toàn linh động - giống hệt như Late
Binding.
Thật ra, CLR (Common Language Runtime) dùng reflection để implement Late
Binding dùm cho chúng ta. Thay vì bắt chúng ta phải tự dùng reflection để code
Late Binding, .NET đã tử tế lo lắng chuyện ấy một cách tự động cho chúng ta.
Dùng Function CType
Dầu ta có dùng Late Binding hay không, nhiều khi rất tiện để ta pass reference
đến một object nào đó, từ chỗ nầy đến chỗ khác, bằng cách dùng Data Type
Object tổng quát - khi nào cần dùng nó thì ta đổi nó ra đúng loại Object trong
hoàn cảnh. Ta thực hiện việc convert data type bằng cách dùng Function
CType, điều đó cho phép ta nói trước Data Type Object sẽ được converted ra
object của class nào để gọi một method theo cách Early Bound:
Module LateBind
Public Sub LàmViệc( ByVal obj As Object)
CType(obj, TheClass).CôngTácTôi()
End Sub
End Module
Trong thí dụ trên dù rằng ta đang làm việc với variable thuộc type Object - trên
nguyên tắc thì có vẽ là Late Bound - nhưng chúng ta đang dùng Function
CType để convert obj ra một object thuộc class TheClass.
Kỹ thuật nầy được gọi là casting (đổ khuôn). Nếu ta xem TheClass như một
cái khuôn, khi ta ép obj vào khuôn ấy thì giống như đổ khuôn để cho obj có
dạng của TheClass.
Function CType rất hữu dụng khi ta làm việc với những objects có implement
nhiều interfaces, vì ta có thể dùng cùng một object cho những interfaces khác
nhau. Giả dụ như ta có một object thuộc loại TheClass và nó cũng có implement
một interface tên MyInterface, ta có thể dùng interface ấy trong code sau đây:
Dim obj As TheClass
obj = New TheClass
CType(obj, MyInterface).DoSomething()
Theo cách trên ta có thể gọi methods theo cách Early Bound trong nhiều
interfaces của một object mà không cần phải declare một variable mới.
Thừa kế từ một ngôn ngữ khác
VB.NET code được compile ra IL (Intermediate Language) managed code, tức là
code sẽ được CLR (Common Language Runtime) chạy trong .NET Framework.
Mọi managed code, không cần biết được compiled từ ngôn ngữ nào đều có thể
làm việc chung nhau, tức là ta có thể tạo một class trong ngôn ngữ nầy và dùng
nó trong một ngôn ngữ khác, kể cả việc thừa kế.
Thật ra hầu như ta luôn luôn làm việc ấy khi viết VB.NET. Đó là vì phần lớn .NET
system library
được viết bằng C#, nhưng ta dùng hay thừa kế từ nó thường xuyên trong
VB.NET.
Tạo một VB.NET BaseClass
Trong thí dụ về thừa kế từ một ngôn ngữ khác, trước hết ta thử tạo một Class
Library Project trong VB.NET tên vblib và thêm vào đó một class đơn giản tên
Parent giống như sau:
Public Class Parent
Public Sub SayHello()
MsgBox("Hello from Parent Class", MsgBoxStyle.Information,
"Parent Class in VB.NET")
End Sub
End Class
Ta sẽ dùng Parent làm BaseClass để thừa kế thành một SubClass trong C#.
Tạo một C# SubClass
Dùng File | Add Project để thêm một C# Class Library project mới và đặt tên
nó là cslib. Reference vblib bằng cách dùng Menu command Project | Add
Reference... và chọn Tab Projects, click Browse để tìm vblib.dll trong
vblib\bin subfolder.
Lưu ý là ta vừa mới reference vblib.dll, cái assembly của Class Parent, chớ ta
không đụng đến hay cần VB.NET source code của Class Parent. Trong C#, ta sẽ
thừa kế Class Parent qua reference BaseClass trong vblib.dll assembly.
Bây giờ code C# như sau:
namespace cslib
{
using System.Windows.Forms;
using vblib;
public class cSharpclass : Parent
{
public cSharpclass()
{
MessageBox.Show("Instantiating cSharpclass object, inheriting
VB.NET Parent class", "CSharp Class");
}
}
}
Code C# bên trên có nhiều điểm tương đồng với VB.NET. Tuy nhiên vì C# đến
từ ngôn ngữ lập trình C và C++ nên nó có syntax hơi khác một chút:
• Mọi statement trong C# phải chấm dứt bằng dấu ; để đánh dấu cuối hàng
• Cặp dấu ngoặc cong queo { .. } được dùng để đánh dấu đầu và cuối của
một Statement Block thay vì dùng End Sub.
• Keyword using được dùng thay vì keyword Imports trong VB.NET
• C# thì case sensitive, tức là phân biệt chữ hoa, chữ thường - thí dụ obj
thì khác với Obj.
• Constructor method mang cùng tên với class thay vì tên New như trong
VB.NET.
Ta hãy thử đi qua các dòng code. Câu thứ nhất định nghĩa namespace cho
source file. Trong C#, mọi namespace phải được tuyên bố rõ ràng (explicitly
declared) trong mỗi code module.
namespace cslib
Kế đó là hai câu tuyên bố ta nhập khẩu System.Windows.Forms và vblib:
using System.Windows.Forms;
using vblib;
Câu kế đó tuyên bố cSharpclass thừa kế từ class Parent, để ý cách dùng dấu :
thay vì keyword Inherits:
public class cSharpclass : Parent
Sau cùng là Constructor dùng chính tên của class:
public cSharpclass()
{
MessageBox.Show("Instantiating cSharpclass object, inheriting
VB.NET Parent class", "CSharp Class");
}
Để ý cách dùng MessageBox.Show giống hệt như trong VB.NET để hiển thị
một message.
Tạo một program Client
Dùng menu command File | Add Project để thêm một VB.NET Windows
Application project mới cho solution. Trong project mới nầy ta dùng menu
command Project | Add Reference... để thêm references cho cslib và vblib.
Right-click lên project trong Solution Explorer và chọn nó làm Set As Startup
Project để project nầy chạy khi ta bấm F5.
Bây giờ đặt một Button tên BtnStartDemo lên Form và viết code dưới đây để xử
lý Event Click:
Private Sub BtnStartDemo_Click( ByVal sender As System.Object, _
ByVal e As System.EventArgs)
Handles BtnStartDemo.Click
Dim objCS As New cslib.cSharpclass()
objCS.SayHello()
End Sub
Khi ta chạy program và click button StartDemo ta sẽ thấy một dialog cho biết
Constructor của cSharpclass đang được gọi để instantiate object objCS:
Tiếp theo đó một dialog thứ nhì hiển thị message từ Sub SayHello mà objCS
thừa kế từ BaseClass Parent:
Bạn có thể Download source code của program nầy tại đây.
Thừa kế hình ảnh (Visual Inheritance)
Cho đến bây giờ ta đã bàn qua chức năng OO của ngôn ngữ VB.NET, phần lớn
nhắm vào đặc tính thừa kế.
Vì các hình ảnh (Visual Components) trong VB.NET được implemented bằng
ngôn ngữ lập trình chính quy chớ không phải dùng một cách thức khác biệt như
trong VB6 (tin tức diễn tả các hình ảnh nằm ở phần đầu các *.frm files), nên
VB.NET cũng hổ trợ Thừa kế hình ảnh (Visual Inheritance) cho Windows
Forms một cách tự nhiên. Điều nầy có nghĩa là sau khi làm xong một Windows
Form với những Textboxes, Labels, Listboxes ..v.v.. ta có thể thừa kế nó rồi để
vô thêm các hình ảnh khác. Ta sẽ bàn vô chi tiết về chuyện nầy trong tương lai.
Ta cũng có thể thừa kế từ chính các hình ảnh. Thí dụ ta có thể thừa kế từ một
Textbox để tạo ra một class Textbox mới, có thêm chức năng nhận keystrokes
theo cách VNI và hiển thị chữ Việt Unicode.
Cùng một nguyên tắc thừa kế nầy của Windows Forms Controls cũng áp dụng
cho Web Forms Controls, tức là ta có thể SubClass một Web Forms Control,
cho thêm các chức năng mới và overriding một số chức năng có sẵn.
Học Microsoft .NET
Vovisoft © 2000. All rights reserved.
Last Updated: Webmaster
File đính kèm:
Lập trình VB.NET - Bài 7_Những chắc năng đối tượng mới của VB.NET (phần 4).pdf

