Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 18 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
18
Dung lượng
295,45 KB
Nội dung
Các tập Microsoft NET 91 Sub VôĐề thật nằm ClassCha mà ClassCon thừa kế nên VôĐề executed ClassCha gọi Sub ChàoHỏi class ( ClassCha) Nhưng ClassCon có implementation Sub ChàoHỏi nên overrides ChàoHỏi ClassCha Overridding Method New Chúng ta thấy ta override methods dùng keywords Me, MyBase MyClass để gọi overriden methods dây chuyền thừa kế Tuy nhiên, Constructor class có luật lệ đặc biệt dành riêng cho method New Những methods New không tự động di truyền từ BaseClass xuống SubClass Mỗi SubClass phải có implementation riêng cho Constructor dù rằng, muốn, gọi vào BaseClass với keyword MyBase: Public Class ClassCon Inherits ClassCha Public Sub New() MyBase.New() ' để thêm code khác để initialise End Sub End Class Các tập Microsoft NET 92 Khi gọi Constructor BaseClass, ta phải gọi trước - không bị error Tuy nhiên ta không cần gọi Constructor BaseClass Constructor BaseClass gọi tự động Có luật đặc biệt tất methods New BaseClass đòi hỏi parameters ta phải implement method New SubClass ta phải đặt statement MyBase.New phía đầu Dĩ nhiên ta Overload method New SubClass, ta phải tự lo liệu cách gọi method New thích hợp BaseClass Tạo BaseClasses Abstract Methods Cho đến ta bàn virtual method với đặc tính override nguyên tắc thừa kế Trong thí dụ trước BaseClass instantiated thành Object để làm chuyện này, chuyện Nhưng ta muốn tạo BaseClass để dùng cho thừa kế mà Keyword MustInherit (Phải Thừa Kế) Trở lại thí dụ Inheritance với Class LineItem Sở dĩ ta đặt Class LineItem chứa thứ chung cho hai classes ProductLine ServiceLine Chớ thật Object Class LineItem không chứa đủ đặc tính để làm việc thực tế Nếu ta muốn nói rõ Class LineItem dùng để tạo SubClasses cách thừa kế từ nó, ta declare sau: Public MustInherit Class LineItem Tức ta thêm keyword MustInherit thôi, khơng thay đổi khác Kết từ Client code instantiate Object từ Class LineItem Do dịng code sau bị syntax error: Dim myObject As New LineItem() Thay vào đó, muốn dùng LineItem ta phải tạo SubClass từ Keyword MustOverride (Phải bị Lấn Quyền) Tương tự với ý niệm Phải-được-thừa-kế Class, ta có MustOverride cho method Có thể BaseClass ta khai báo method, ta đòi hỏi method phải có implementation SubClass Ta declare sau: Các tập Microsoft NET 93 Dim MustOverride Sub CalculatePrice Để ý khơng có thân thể Sub CalculatePrice hay statement End Sub Khi dùng MustOverride ta không phép cung cấp implementation cho method BaseClass Một method gọi abstract method hay pure virtual function, có phần khai báo khơng có phần định nghĩa Những abstract methods phải overridden SubClass BaseClass dùng Nếu khơng, ta khơng có phần implementation method đâu compile gặp syntax error Abstract Base Classes Nếu hợp hai ý niệm MustInherit MustOverride lại ta tạo abstract base class Đây Class có khai báo hồn tồn khơng có implementation Ta phải SubClass từ làm việc được, thí dụ như: Public MustInherit Class ClassCha Public MustOverride Sub VôĐề() Public MustOverride Sub ChàoHỏi() End Class Kỹ thuật thích hợp để ta code sườn hay bố cục program lúc thiết kế Class thừa kế ClassCha phải implement Sub VôĐề lẫn Sub ChàoHỏi, không bị syntax error Nhìn phương diện, abstract base class giống khai báo Interface Nếu dùng Interface, khai báo sau: Public Interface ICha Sub VôĐề() Sub ChàoHỏi() End Interface Bất class chịu implement interface ICha phải implement Sub VơĐề lẫn Sub ChàoHỏi, khơng bị syntax error - đó, ta thấy Interface giống abstract base class Các tập Microsoft NET 94 Sự khác biệt abstract base class với Interface chỗ thừa kế Khi ta tạo class cách SubClass từ ClassCha, class lại SubClassed Mấy class cháu tự động thừa kế VơĐề ChàoHỏi từ class Trong nói Interface, class phải tự implement ICha cách độc lập phải cung cấp hai Subs VôĐề ChàoHỏi Vì thế, ta khơng có ý định dùng lại code Subs ta tạo classes ta dùng interface Ngược lại ta muốn dùng lại code SubClass theo nguyên tắc thừa kế ta nên dùng abstract base class Các tập Microsoft NET 95 Bài Những chức Đối Tượng VB.NET (phần IV) Dùng OO VB.NET Shared class members ( Các thành viên để dùng chung class) Mặc dù Object hiệu hữu ích, có ta muốn truy cập variables hay methods class để làm việc mà không cần phải instantiate Object Tức y khứ, viết VB6, ta dùng variables hay methods BAS Module Đại khái giống thay ký giao kèo với thầu (Object) để thực cơng trình, ta muốn mướn thợ hay chuyên viên làm việc gia công ( gọi methods) Shared Methods Trong VB.NET Class có methods properties thông thường ta thấy - tức methods properties Object ta dùng sau Object thành hình qua trình instantiation - mà cịn có methods properties ta dùng mà khơng cần phải tạo instance từ Class Chúng gọi shared methods ( Trong ngơn ngữ lập trình khác methods gọi static methods hay class methods) Ta truy cập shared method qua Object method bình thường, phải dùng trực tiếp tên class Thí dụ sau minh họa điều này: Public Class Math Shared Function Add( ByVal x As Single, ByVal y As Single) As Single Return x + y End Function End Class Sau định nghĩa Class Math, ta dùng Shared Function Add mà không cần instantiate Object thuộc class Math sau: Các tập Microsoft NET 96 Dim Result As Single result = Math.Add(12.5, 36.8) Để ý thay dùng object variable ta dùng thẳng tên class Math để truy cập method Add Với method bình thường làm bị syntax error, trường hợp khơng Ta overload shared methods, tức code nhiều shared methods với tên có parameter lists khác Phạm vi hoạt động bình thường (Default Scope) shared methods Public Tuy nhiên ta giới hạn việc truy cập chúng cách dùng Access Modifiers Friend, Protected hay Private Thật overloading shared method ta dùng scopes khác cho shared method Có thí dụ shared method từ NET system class libraries Để mở text file theo mode input, điển hình ta dùng shared method File class sau: Dim inFile As StreamReader = File.OpenText("words.txt") Dim strIn As String strIn = inFile.ReadLine() Ở khơng có object File tạo Method OpenText shared Function, mở input text file words.txt cho ta object loại StreamReader tên inFile để ta dùng sau Shared Variables Đơi ta muốn tất objects class dùng chung variable Ta thực việc với shared variables Một shared variable khai báo với keyword shared giống shared method: Public Class MyCounter Private Shared mintCount As Integer End Class Các tập Microsoft NET 97 Ta cho shared variable scope Public hay Private tùy ý, By Default, scope shared variables Private, khác với shared methods By Default Public Điểm quan trọng shared variables chúng dùng chung instances (objects) class Dưới thí dụ ta giữ counter có trị số tăng thêm lần có instance class MyCounter Bất lúc ta biết có objects tạo cách đọc property Count: Public Class MyCounter Private Shared mintCount As Integer Public Sub New() mintCount += End Sub Public ReadOnly Property Count() As Integer Get Return mintCount End Get End Property End Class Như thế, ta chạy client code hiển thị kết 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") Các tập Microsoft NET 98 End Sub Nếu ta chạy code thêm hai lần nữa, ta có Hể ta cịn chạy chương trình counter làm việc Khi ta chấm dứt chương trình counter biến Global values Một cách dùng thông dụng khác shared variable xem loại Global variable Khi dùng scope Public ta có dạng tương đương với VB6 Global variable BAS Module Thí dụ như: Public Class GlobalData Public Shared TotalCost As Single End Class Sau ta dùng variable khắp nơi client code: GlobalData.TotalCost += 45.60 Events Raising Event để xử lý Project khác VB.NET không hổ trợ Events từ đời cha đến đời theo nguyên tắc thừa kế Nếu BaseClass định nghĩa Public Event ta raise event code BaseClass raise event SubClass BaseClass Khác với methods, ta overload Event, tức dùng tên cho hai Events có parameter list khác Ta tạo Class Library Project với Class có raise Event tạo project khác có code để đón nhận xử lý Event Để thử việc bạn tạo Class Library Project với tên ClassLibrary1 viết dòng code định nghĩa Class Class1 với Event TheEvent Sub LàmViệc để raise Event sau: Public Class Class1 Public Event TheEvent() Các tập Microsoft NET 99 Public Sub LàmViệc() RaiseEvent TheEvent() End Sub End Class Kế bạn dùng Menu command File | Add Project | New Project để thêm project với tên EventClass Để dùng Class1, bạn cần phải reference với Menu command Project | Add Reference , chọn Tab Projects click Browse để chọn ClassLibrary1.DLL từ subfolder ClassLibrary1\bin solution hình đây: Một referenced ClassLibrary1 với Class1 ấy, bạn doubleclick lên Form1 để code 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 Các tập Microsoft NET 100 Nhớ ta phải declare variable obj thuộc loại ClassLibrary1.Class1 với WithEvents Đặt Button tên BtnLàmViệc doubleclick lên để code 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 obj bạn chọn tên từ combobox phía bên trái, chọn TheEvent từ combobox bên phải hình đây: Ở ta handle Event cách hiển thị message đơn giản: Đang xử lý Event từ Class1 Bây bạn chạy program Khi bạn click Button BtnLàmViệc program hiển thị message để chứng minh từ Application ta handle event Class Project khác Các tập Microsoft NET 101 Ghi Nếu sau Unzip source file load project vào, bạn dùng IDE Menu command Build | Rebuild Solution để compile lại hết modules gặp error references làm sau: • Trong Solution Explorer click tree nodes references để tìm references có dấu chấm thang tam giác vàng remove chúng • Dùng Menu command Project | Add Reference để chọn *.dll lại từ \bin subfolder • Rebuild Solution Nếu bạn dùng chữ Việt Unicode program nhớ set up Advanced Save Option với Menu command File hình đây: Các tập Microsoft NET 102 Khi Dialog ra, bạn chọn Unicode (UTF-8) cho Encoding: Nếu bạn khơng thấy có menuItem Advanced Save Option Menu File dùng menuItem Save As click lên combo box Save phía dưới, bên phải Save File As Dialog chọn Save with Encoding hình đây: Các tập Microsoft NET 103 Nếu bạn quên set up Advanced Save Option trên, chữ Việt bị lưu trử dạng ANSI nên số dấu chữ Việt thay vào dấu ? Shared Events Events declared Shared Shared methods raise shared events, chúng khơng thể raise non-shared events Thí dụ như: Public Class NguồnEvent Shared Event EventDùngChoSharedMethods() Public Shared Sub DùngChung() RaiseEvent EventDùngChoSharedMethods() End Sub End Class Một shared event raised shared methods lẫn nonshared methods: Public Class NguồnEvent Public Event TheEvent() Các tập Microsoft NET 104 Shared Event EventDùngChoSharedMethods() Public Shared Sub DùngChung() RaiseEvent EventDùngChoSharedMethods() End Sub Public Sub LàmViệc() RaiseEvent TheEvent() RaiseEvent EventDùngChoSharedMethods() End Sub End Class Nếu bạn tìm cách raise non-shared event từ shared method bị syntax error Early Binding hay Late Binding (Hiệu lực Sớm hay Trễ) Early Binding có nghĩa program biết rõ từ đầu loại Object (thuộc Class nào) dùng hồn cảnh Nó cho phép IntelliSense hiển thị cho ta thấy class members ta dùng compiler kiểm xem methods ta dùng có hữu khơng Early Binding code compiled IL hiệu compiler biết rõ ràng data types parameters Ngược lại Late Binding có nghĩa ta làm việc cách linh động với Object lúc run-time, tức program trước Object thuộc loại Late Binding cho ta uyển chuyển Object cung cấp method cần thiết đủ Do đó, ta khơng hưởng sang trọng IntelliSense cung cấp compiler kiểm soát loại Object trước dùm cho ta Mặc dầu Late Binding code chạy chậm cho ta tự giống làm việc đời, để đến chót xác nhận By Default, objects VB.NET 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 source file Các tập Microsoft NET 105 Dùng Object Type Ta có Late Binding compiler xác định loại Object ta gọi Ta thực điều cách dùng Object Type để tuyên bố cách mơ hồ ta dùng loại Object đó, variable với Object type hold-reference-to Object Do đó, dịng code sau dùng cho Object mà Class có implement Sub CơngTácTơi không dùng parameter 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ó Sub CơngTácTơi chẳng dùng parameter hết program bị error lúc run-time Do đó, ta nên ln ln dùng Try Structure để bắt 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 Reflection Các tập Microsoft NET 106 NET framework hổ trợ ý niệm gọi reflection Nó nói đến khả program kiểm tra NET code để biết code có thứ Ta dùng namespace System.Reflection để viết code làm chuyện Với System.Reflection ta viết code để khám phá classes nằm assembly, để biết class có methods, properties events Tiếp theo đó, ta dùng reflection để instantiate dùng objects từ classes Cả trình hoàn toàn linh động - giống hệt Late Binding Thật ra, CLR (Common Language Runtime) dùng reflection để implement Late Binding dùm cho Thay bắt phải tự dùng reflection để code Late Binding, NET tử tế lo lắng chuyện cách tự động cho Dùng Function CType Dầu ta có dùng Late Binding hay khơng, nhiều tiện để ta pass reference đến object đó, từ chỗ đến chỗ khác, cách dùng Data Type Object tổng qt - cần dùng ta đổi loại Object hồn cảnh Ta thực việc convert data type cách dùng Function CType, điều cho phép ta nói trước Data Type Object converted object class để gọi 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ụ ta làm việc với variable thuộc type Object - ngun tắc có vẽ Late Bound - dùng Function CType để convert obj object thuộc class TheClass Kỹ thuật gọi casting (đổ khuôn) Nếu ta xem TheClass khn, ta ép obj vào khn giống đổ khn obj có dạng TheClass Function CType hữu dụng ta làm việc với objects có implement nhiều interfaces, ta dùng object cho Các tập Microsoft NET 107 interfaces khác Giả dụ ta có object thuộc loại TheClass có implement interface tên MyInterface, ta dùng interface code sau đây: Dim obj As TheClass obj = New TheClass CType(obj, MyInterface).DoSomething() Theo cách ta gọi methods theo cách Early Bound nhiều interfaces object mà không cần phải declare variable Thừa kế từ ngôn ngữ khác VB.NET code compile IL (Intermediate Language) managed code, tức code CLR (Common Language Runtime) chạy NET Framework Mọi managed code, không cần biết compiled từ ngơn ngữ làm việc chung nhau, tức ta tạo class ngơn ngữ dùng ngơn ngữ khác, kể việc thừa kế Thật ta ln ln làm việc viết VB.NET Đó phần lớn NET system library viết C#, ta dùng hay thừa kế từ thường xuyên VB.NET Tạo VB.NET BaseClass Trong thí dụ thừa kế từ ngôn ngữ khác, trước hết ta thử tạo Class Library Project VB.NET tên vblib thêm vào class đơn giản tên Parent giống sau: Public Class Parent Public Sub SayHello() MsgBox("Hello from Parent Class", MsgBoxStyle.Information, "Parent Class in VB.NET") End Sub End Class Ta dùng Parent làm BaseClass để thừa kế thành SubClass C# Các tập Microsoft NET 108 Tạo C# SubClass Dùng File | Add Project để thêm C# Class Library project đặt tên cslib Reference vblib cách dùng Menu command Project | Add Reference chọn Tab Projects, click Browse để tìm vblib.dll vblib\bin subfolder Lưu ý ta vừa reference vblib.dll, assembly Class Parent, ta không đụng đến hay cần VB.NET source code Class Parent Trong C#, ta thừa kế Class Parent qua reference BaseClass vblib.dll assembly Bây code C# 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 có nhiều điểm tương đồng với VB.NET Tuy nhiên C# đến từ ngơn ngữ lập trình C C++ nên có syntax khác chút: • Mọi statement C# phải chấm dứt dấu ; để đánh dấu cuối hàng • Cặp dấu ngoặc cong queo { } dùng để đánh dấu đầu cuối Statement Block thay dùng End Sub ... tắc thừa kế ta nên dùng abstract base class Các tập Microsoft NET 95 Bài Những chức Đối Tượng VB.NET (phần IV) Dùng OO VB.NET Shared class members ( Các thành viên để dùng chung class) Mặc dù... Handles MyBase.Load obj = New ClassLibrary1.Class1() End Sub Các tập Microsoft NET 10 0 Nhớ ta phải declare variable obj thuộc loại ClassLibrary1.Class1 với WithEvents Đặt Button tên BtnLàmViệc... Project với tên ClassLibrary1 viết dòng code định nghĩa Class Class1 với Event TheEvent Sub LàmViệc để raise Event sau: Public Class Class1 Public Event TheEvent() Các tập Microsoft NET 99 Public