Các bài tập Microsoft .NET 91
Sub VôĐề thật ra nằm trong ClassCha mà ClassCon thừa kế nên VôĐề
được executed trong ClassCha và gọi Sub ChàoHỏi trong cùng class (
ClassCha). Nhưng vì ClassCon có một implementation của Sub ChàoHỏi
nên nó overrides ChàoHỏi của ClassCha.
Overridding Method New
Chúng ta đã thấy ta có thể override methods và dùng các keywords Me,
MyBase và MyClass để gọi các overriden methods trong dây chuyền thừa
kế. Tuy nhiên, đối với Constructor của class thì có những 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ó một implementation riêng cho
Constructor dù rằng, nếu muốn, nó có thể gọi vào BaseClass với keyword
MyBase:
Public Class ClassCon
Inherits ClassCha
Public Sub New()
MyBase.New()
' để thêm các code khác để initialise tại đây
End Sub
End Class
Các bài tập Microsoft .NET 92
Khi gọi Constructor của BaseClass, ta phải gọi nó trước nhất - nếu không
sẽ bị error. Tuy nhiên ta không cần gọi Constructor của BaseClass vì
Constructor của BaseClass được gọi tự động.
Có một luật đặc biệt là nếu tất cả methods New trong BaseClass đều đòi
hỏi parameters thì ta phải implement ít nhất một method New trong
SubClass và ta phải đặt statement MyBase.New ngay phía đầu.
Dĩ nhiên là ta có thể Overload method New trong SubClass, nhưng ta
phải tự lo liệu cách gọi một method New thích hợp trong BaseClass.
Tạo BaseClasses và Abstract Methods
được. Nếu không, ta sẽ không có phần implementation của method đâu cả
và khi compile sẽ gặp syntax error.
Abstract Base Classes
Nếu hợp cả hai ý niệm MustInherit và MustOverride lại ta sẽ tạo ra một
abstract base class. Đây là một Class chỉ có khai báo chớ hoàn toàn
không có implementation. Ta phải SubClass từ nó thì mới 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 rất thích hợp để ta code cái sườn hay bố cục của program
ngay trong lúc thiết kế. Class nào thừa kế ClassCha thì phải implement
cả Sub VôĐề lẫn Sub ChàoHỏi, nếu không sẽ bị syntax error.
Nhìn về một phương diện, abstract base class rất giống khai báo Interface.
Nếu dùng Interface, chúng ta có thể khai báo như sau:
Public Interface ICha
Sub VôĐề()
Sub ChàoHỏi()
End Interface
Bất cứ class nào chịu implement interface ICha thì phải implement cả
Sub VôĐề lẫn Sub ChàoHỏi, nếu không sẽ bị syntax error - do đó, ta
thấy Interface rất giống một abstract base class.
Các bài tập Microsoft .NET 94
Sự khác biệt chính giữa abstract base class với Interface là ở chỗ thừa kế.
Khi ta tạo một class con bằng cách SubClass từ ClassCha, chính class con
ấy lại cũng có thể được SubClassed. Mấy class cháu này sẽ tự động thừa
kế VôĐề và ChàoHỏi từ class con.
Trong khi ấy nói về Interface, mỗi class phải tự implement ICha một cách
độc lập và phải cung cấp hai Subs VôĐề và ChàoHỏi của chính nó. Vì
Return x + y
End Function
End Class
Sau khi định nghĩa Class Math, ta có thể dùng Shared Function Add
mà không cần instantiate một Object thuộc class Math như sau: