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