Tài liệu Những chức năng Đối Tượng mới của VB.NET (phần III) docx

11 385 0
Tài liệu Những chức năng Đối Tượng mới của VB.NET (phần III) docx

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Bài Những chức Đối Tượng VB.NET (phần III) Dùng OO VB.NET Ngăn cản Thừa kế Bình thường (By default) class dùng làm base class để từ ta thừa kế Nhưng ta không muốn cho thừa kế từ Class đó, để làm việc ta dùng keyword NotInheritable declare class: Public NotInheritable Class KhôngCon End Class Khi ta dùng keyword NotInheritable khơng class dùng keyword Inherits để tạo subclass từ class Thừa kế Phạm vi hoạt động Khi ta dùng đặc tính thừa kế để tạo SubClass class nầy có đủ methods, propertỉes variables với Access Modifier Public hay Friend SuperClass Bất thứ declared Private SuperClass SubClass khơng thấy hay dùng Có ngoại lệ New method Các Constructor methods cần phải implemented (định nghĩa) lại SubClass Một chốc ta bàn vào chi tiết điểm nầy Để làm sáng tỏ vấn đề SubClass dùng Class Members SuperClass, ta thử code lại Function Amount LineItem class cách khiến gọi Private Function tên CalculateAmount để tính Amount thay để tính trực tiếp trước đây: Public Function Amount() As Single Return CalculateAmount End Function Private Function CalculateAmount() As Single Return mintQuantity * msngPrice End Function Khi ta SubClass LineItem để tạo ServiceLine class, Object ServiceLine thừa kế Function Amount Function declared Public BaseClass LineItem Ngược lại, Function CalculateAmount Private nên ServiceLine class lẫn client code dùng LineItem Object không truy cập Như thế, ta gọi Function Amount được, đến phiên gọi Private Function CalculateAmount có bị trở ngại khơng? Khơng Vì Function Amount nằm Class với Private Function CalculateAmount nên gọi được, ta gọi Function Amount từ ServiceLine hay client code Thí dụ client code ta có hàng code sau: Protected Sub BtnShowAmount_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles BtnShowAmount.Click Dim Service As ServiceLine Service = New ServiceLine() Service.Item = "Delivery" Service.Price = 50 Service.DateProvided = Now MessageBox.Show (Service.Amount.ToString, "Amount", MessageBoxButtons.OK, MessageBoxIcon.Information) End Sub Kết hiển thị message box, cho thấy Function CalculateAmount Function Amount gọi dùm cho client code client code lẫn ServiceLine code gọi trực tiếp Điểm nầy nhắc tơi nhớ lại cịn bé, có lần bà vườn đem chợ cho ba má tơi thúng xồi thơm ngon Bạn tơi lối xóm thấy biểu tơi lấy hai trái xồi để ăn vụn Vì khơng phải người nhà nên bạn lấy đuợc xoài, Access Modifier thún xoài Private nhà tơi Nhưng tơi Public, nên bạn tơi nhờ tơi lấy dùm Protected Methods Đơi Public hay Private chưa đủ Nếu ta declare thứ Private hồn tồn giới hạn class, ngược lại ta declare Public (hay Friend) dùng subclasses hay client code Tuy nhiên, có lúc ta muốn class member dùng subclasses thơi, khơng cho client code dùng Trong trường hợp ta dùng keyword Protected Thí dụ: Public Class FatherClass Protected DiSản As Single End Class Public Class SonClass Inherits FatherClass Public Function ChiaCủa() As Single Return Disản End Function End Class Ở ta có BaseClass FatherClass với Protected Field Disản Khơng có client code thấy Field DiSản Thế SubClass FatherClass thừa kế dùng DiSản Trong thí dụ trên, lần SubClass có Public method (ChiaCủa) return protected value - value ấy, DiSản, không trực tiếp cho phép client code dùng Overriding Methods Chúng ta biết đặc tính quan trọng Inheritance SubClass thừa kế behaviours ParentClass mà cịn override (lấn quyền) behaviours Chúng ta thấy SubClass extend (thêm ra) ParentClass cách cho thêm methods Public, Protected Friend Hơn nữa, dùng overriding, SubClass alter (sửa đổi) behaviours methods ParentClass Bình thường (By default), ta khơng thể override methods ParentClass trừ methods declared với keyword Overridable ParentClass Thí dụ: Public Class ClassCha Public Overridable Sub ChàoHỏi() MessageBox.Show("Chào cháu", "Class Cha") End Sub End Class Tiếp theo, tạo SubClass, muốn ta override behaviour Sub ChàoHỏi cách dùng keyword Overrides sau: Public Class ClassCon Inherits ClassCha Public Overrides Sub ChàoHỏi() MessageBox.Show("Thưa Bác", "Class Con") End Sub End Class Bây ta viết client code sau: Private Sub BtnSubClassObject_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles BtnSubClassObject.Click Dim obj As New ClassCon() obj.ChàoHỏi() End Sub Khi ta click button BtnSubClassObject program hiển thị message dialog đây: Virtual Methods Tuy nhiên, xem trường hợp ta code sau: Private Sub BtnParentClassObject_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles BtnParentClassObject.Click Dim obj As ClassCha obj = New ClassCon() obj.ChàoHỏi() End Sub Trước hết, kỳ kỳ, declare variable loại ClassCha mà lại instantiate object ClassCon Chuyện hồn tồn bình thường, ClassCon ClassCha Tức variable loại ClassCha hay ClassCon chứa, thật hold references to (point to, tới), instance ClassCon Điểm nầy áp dụng tổng quát ta dùng Inheritance Một variable loại SuperClass hold reference to SubClass Object thừa kế từ SuperClass Đó cách để ta implement tính đa dạng (polymorphism) Đều làm ta ngạc nhiên ta click button BtnParentClassObject ta thấy hiển thị message " Thưa Bác" Sao lạ vậy? Variable obj declared ClassCha message "Chào cháu"? Lý Sub ChàoHỏi ClassCon gọi thay Sub ChàoHỏi ClassCha Ta nói Sub ChàoHỏi Virtual method Tất methods VB.NET virtual Ý niệm virtual để nói implementation cháu trẻ dòng họ dùng - khơng cần biết variable có data type class hệ dòng họ Tức là, variable dùng client code hold references to ClassÔngNội, ClassCha, ClassCon hay ClassCháu method ClassCháu gọi Nếu ClassCháu khơng có implementation method ta gọi method ClassCon, khơng có gọi method ClassCha v.v theo thứ tự từ bề lên bề Bạn Download source code program nầy Keyword Me Keyword Me dùng ta muốn nói rõ (explicitly) ta muốn dùng method Class chứa code ấy, khơng phải implementation khác method Cũng có trường hợp ta phải dùng keyword Me để nói ta muốn dùng class-level variable khơng phải procedure-level variable có tên Một procedurelevel variable, tức local variable method, có tên với classlevel variable gọi shadowed variable Thí dụ: Public Class TheClass Private strName As String Public Sub DoSomething() Dim strName As String strName = "Quang" End Sub End Class Ở đây, variable strName declared class-level bên Sub DoSomething Bên method local variables (kể shadowed variables) dùng chúng che đậy class-level variables trừ ta nói rõ phải dùng variable class-level cách dùng keyword Me: Public Class TheClass Private strName As String Public Sub DoSomething() Dim strName As String strName = "Quang" ' thay đổi value local (shadowed) variable Me.strName = "Kim" ' thay đổi value class-level variable End Sub End Class Keyword MyBase Keyword Me tiện dụng ta muốn dùng Class members Class chứa code Tương tự vậy, ta muốn dùng Class method BaseClass (cũng gọi SuperClass), implementation method SubClass Nhớ virtual method luôn gọi implementation Class trẻ Từ SubClass, muốn gọi method BaseClass ta dùng keyword MyBase sau: Public Class ClassCon Inherits ClassCha Public Overrides Sub ChàoHỏi() MessageBox.Show("Thưa Bác", "Class Con") MyBase.ChàoHỏi() End Sub End Class Bây ta chạy Sub ChàoHỏi ClassCon ta có hai messages, từ ClassCon theo sau từ ClassCha MyBase nói đến BaseClass trực tiếp, tức Class cha thơi khơng nói đến Class ông nội Không có cách để nói đến hệ Dầu vậy, keyword Mybase dùng cho thứ declared Public, Friend hay Protected ParentClass Điều nầy kể thứ mà ParentClass thừa kế từ hệ trước gia đình, tức ClassƠngNội, ClassƠngCố v.v Keyword MyClass Vì lý virtual method, ta gặp trường hợp rắc rối code ParentClass lại chạy code SubClasses Khi viết code class, từ method nầy ta thường gọi methods khác nằm class Thí dụ như: Public Class ClassCha Public Sub VôĐề() ChàoHỏi() End Sub Public Overridable Sub ChàoHỏi() MessageBox.Show("Chào cháu", "Class Cha") End Sub End Class Trong trường hợp nầy, VơĐề gọi Sub ChàoHỏi để đón tiếp Để ý ChàoHỏi declared Overridable nên SubClass implement method ChàoHỏi lấn quyền Thí dụ: Public Class ClassCon Inherits ClassCha Public Overrides Sub ChàoHỏi() MessageBox.Show("Thưa Bác", "Class Con") End Sub End Class Vì đặc tính virtual ChàoHỏi nên ta tưởng ClassCha execute Sub ChàoHỏi té lại execute code ChàoHỏi ClassCon Trong code đây, Object ClassCon gọi Sub VôĐề ClassCha: Private Sub BtnSubClassObject_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles BtnSubClassObject.Click Dim obj As New ClassCon() obj.VôĐề() End Sub Trong ClassCha, Sub VơĐề gọi ChàoHỏi nó, nhiên Sub ChàoHỏi bị overridden implementation ChàoHỏi ClassCon Do đó, program hiển thị message "Thưa Bác" Nếu ta không muốn vậy, ta muốn VơĐề execute code ChàoHỏi ClassCha phải dùng keyword MyClass sau: Public Class ClassCha Public Sub VôĐề() MyClass.ChàoHỏi() End Sub Public Overridable Sub ChàoHỏi() MessageBox.Show("Chào cháu", "Class Cha") End Sub End Class Ở ta khơng thể dùng keyword Me VơĐề có gọi ChàoHỏi class-level ClassCha SubClass, bị overridden Hình minh họa trình gọi VơĐề từ client code: 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 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: 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 nầy 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 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 nầy 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 Học Microsoft NET Vovisoft © 2000 All rights reserved Last Updated: Webmaster ... Protected DiSản As Single End Class Public Class SonClass Inherits FatherClass Public Function ChiaCủa() As Single Return Disản End Function End Class Ở ta có BaseClass FatherClass với Protected... Thế SubClass FatherClass thừa kế dùng DiSản Trong thí dụ trên, lần SubClass có Public method (ChiaCủa) return protected value - value ấy, DiSản, không trực tiếp cho phép client code dùng Overriding... Sub ChàoHỏi ClassCon gọi thay Sub ChàoHỏi ClassCha Ta nói Sub ChàoHỏi Virtual method Tất methods VB.NET virtual Ý niệm virtual để nói implementation cháu trẻ dòng họ dùng - khơng cần biết variable

Ngày đăng: 12/12/2013, 11:15

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan