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.

pdf16 trang | Chuyên mục: Visual Basic 6.0 | Chia sẻ: dkS00TYs | Lượt xem: 2403 | Lượt tải: 2download
Tóm tắt nội dung 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), để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
) 
 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:

  • pdfLậ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
Tài liệu liên quan