Nhưng đôi khi ta không muốn cho ai thừa kế từ một Class nào đó, để làm việc ấy ta dùng keyword NotInheritable khi declare class:
Public NotInheritable Class KhôngCon End Class
Khi ta đã dùng keyword NotInheritable rồi thì khơng class nào có thể dùng keyword Inherits để tạo một subclass từ class ấy.
Thừa kế và Phạm vi hoạt động
Khi ta dùng đặc tính thừa kế để tạo một SubClass thì class mới nầy có đủ mọi methods, propertỉes và variables với Access Modifier Public hay Friend của SuperClass. Bất cứ thứ gì declared là Private trong SuperClass thì SubClass khơng thấy hay dùng được.
Có một ngoại lệ là New method. Các Constructor methods cần phải được implemented (định nghĩa) lại trong mỗi SubClass. Một chốc nữa ta sẽ bàn vào chi tiết về điểm nầy.
Để làm sáng tỏ vấn đề SubClass có thể dùng Class Members nào của SuperClass, ta thử code lại Function Amount trong LineItem class bằng cách khiến nó gọi một Private Function tên
CalculateAmount để tính ra Amount thay vì để nó tính trực tiếp như 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 ra ServiceLine class, bất cứ Object ServiceLine nào cũng thừa kế Function Amount vì Function ấy được declared Public trong BaseClass LineItem. Ngược lại, vì Function CalculateAmount là Private nên cả ServiceLine class lẫn bất cứ client code nào dùng một LineItem Object đều khơng truy cập nó được.
Như thế, mặc dầu ta gọi Function Amount được, nhưng đến phiên nó gọi Private Function CalculateAmount thì có bị trở ngại khơng? Khơng sao cả. Vì Function Amount nằm trong cùng
Class với Private Function CalculateAmount nên nó có thể gọi được, dù rằng ta gọi Function Amount từ ServiceLine hay client code.
Thí dụ trong client code ta có những hàng code như 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 quả sẽ được hiển thị trong message box, cho thấy Function CalculateAmount được Function Amount gọi dùm cho client code dù rằng cả client code lẫn ServiceLine code đều không thể gọi trực tiếp được.
Điểm nầy nhắc tơi nhớ lại khi cịn bé, có lần bà con trong vườn đem ra chợ cho ba má tơi cả thúng xồi thơm rất ngon. Bạn tơi ở lối xóm thấy vậy biểu tơi lén lấy hai trái xồi để ăn vụn. Vì khơng phải là người nhà nên bạn tôi khơng thể lấy đuợc xồi, bởi Access Modifier của thún xồi là Private trong nhà tơi. Nhưng vì tơi là Public, nên bạn tơi có thể nhờ tôi lấy dùm.
Protected Methods