Наследяемост (Inheritance)
Най-добрият начин за обяснение на VB .NET наследяемостта е да започнем с пример. Класовете в дадена апликация често
имат родствени връзки един с друг. Да предположим, че информационната апликация
за нашия Служител (Slujasht) съдържа обект Slujasht в класа CSlujasht представен в генерален аспект общ
за всички служители--name, address, Zaplata и
т.н.
Разбира се директорите на училището ще искат да имат
различни права от тези които има секретарката. Основателно е да дефинираме
допълнителни класове наречени CDirector и CSecretary, всеки със свои свойства и методи. От друга страна, директорът е служител (Slujasht), като няма причина да дефинираме две
различни имена в двата случая. Неефективно е!
Ето защо е създадена наследяемастта. Първо, дефинираме класа
CSlujasht, който има свойство Zaplata и метод IncZaplata:
' Slujasht class
Public Class CSlujasht
' Zaplata property е read/write
Private mdecZaplata As
Decimal
Property Zaplata( ) As
Decimal
Get
Zaplata = mdecZaplata
End Get
Set
mdecZaplata = Value
End Set
End Property
Public Overridable Sub IncZaplata(ByVal
sngPercent As Single)
mdecZaplata = mdecZaplata *
(1 + CDec(sngPercent))
End Sub
End Class
След това дефинираме класа CDirector:
' Director Class
Public Class CDirector
Inherits CSlujasht
' Calculate Zaplata нараства базирано на 5% увеличение
Overrides Sub IncZaplata(ByVal
sngPercent As Single)
Me.Zaplata = Me.Zaplata *
CDec(1.05 + sngPercent)
End Sub
End Class
Две неща трябва да отбележим тук. Първо реда:
Inherits CSlujasht
индикира, че класа CDirector наследява (inherits) членовете на класа CSlujasht. Обект от клас CDirector е обект и от тип CSlujasht. Ако дефинираме обект от тип CDirector:
Dim ceo As New CDirector
след това можем да извикаме свойство Zaplata, така:
ceo.Zaplata = 1000
Второ, ключовата дума Overrides в метод IncZaplata означава, че изпълнението на IncZaplata в CDirector е извикано наместо изпълнението в CSlujasht. Така че кодът:
ceo.IncZaplata
касае заплатата в обекта CDirector ceo базирана на пренасянето на разрешение. Присъствието на ключова дума Overridable в дефиницията на IncZaplata в класа CSlujasht, спесифицира, че класът наследяващ
от базовия клас е допуснат да предефинира - override метода на базовия клас.
След това, дефинираме класа CSecretary, който също наследява от CSlujasht но изпълнява различно нарастване на заплатата за обект секретарка:
' Secretary Class - на секретарката
Public Class CSecretary
Inherits CSlujasht
' секретарките вземат 2%
Overrides Sub IncZaplata(ByVal
sngPercent As Single)
Me.Zaplata = Me.Zaplata *
CDec(1.02 + sngPercent)
End Sub
End Class
Сега можем да напишем код за упражнение на тези класове:
Dim ThePrincipal As New CDirector(
)
Dim MySecretary As New
CSecretary( )
' Set заплащане
ThePrincipal.Zaplata = 1000
MySecretary.Zaplata = 300
' Set Slujasht - Principal и incZaplata
Debug.Writeline("Principal
before: " & CStr(ThePrincipal.Zaplata))
ThePrincipal.IncZaplata(0.4)
Debug.WriteLine("Principal
after: " & CStr(ThePrincipal.Zaplata))
' Set Slujasht - Principal и inc Zaplata
Debug.Writeline("Principal
before: " & CStr(ThePrincipal.Zaplata))
ThePrincipal.IncZaplata(0.4)
Debug.WriteLine("Principal
after: " & CStr(ThePrincipal.Zaplata))
' Set Slujasht - Secretary и inc Zaplata
Debug.Writeline("Secretary
before: " & CStr(MySecretary.Zaplata))
MySecretary.IncZaplata(0.4)
Debug.WriteLine("Secretary
after: " & CStr(MySecretary.Zaplata))
Изходът в този случай е:
Principal before: 1000
Principal after: 1450
Secretary before: 300
Secretary after: 396
Можем да кажем следното за наследяемостта:
Ако клас B наследява от клас A, тогава всеки обект от клас B
е също обект и от клас A и включва
публични (public) свойства и методи (това е публичния интерфейс) на клас A. В
този случай, клас A се нарича базов клас (base class), а клас B се нарича произхождащ клас (derived
class). От друга страна, произхождащият клас може да предефинира (override) изпълнението на членове на
базовия клас за собствени нужди.
Наследяването се изпълнява посредством ключова дума Inherits.
Ако трябва да дадем кратка дефиниция, наследяемостта е
възможност нов клас да произхожда (наследява) от по-прост клас (базов клас - base
class).
Произхождащият клас (derived class) наследява всички
полета (fields), свойства (properties), и методи (methods)
на базовия клас и може да модифицира поведението на всички тези свойства и
методи на базовия клас чрез предефинирането им (overriding). А вие
разбира се може да добавяте нови полета, свойства и методи към наследяващия
клас (inherited class).