Няма да влизаме в подробности, защото някои компютърни учени
разглеждат
overloading като форма на
polymorphism, други твърдят че не е така. Ще дискутираме само това, което
директно е свързано с .NET Framework.
-
Overloading
Overloading се свързва с елемент (член),
използван повече от един път. Имената на операторите често се предефинират (
overloaded).
Примерно знак (+) изпълнява събиране на цели числа (integers), събиране
на числа от тип single, събиране на числа от тип double, и конкатенация
(долепяне) на
стрингове (strings). Така че символ (+) се предефинира (
overloaded). Това е добре, защото иначе ще се нуждаем от различни символи; Имената на функциите (Function) също често
се предефинират (overloaded). Например функцията за абсолютна
стойност,
Abs, може да има параметър integer, single, double. Защото името
Abs представлява няколко различни
функции, то се предефинира
(
overloaded). Ако погледнете документацията за
член
Abs на клас
Math (в системното пространство от
имена за базовата библиотека от класове - Base Class Library), ще откриете следната декларация, показваща
различните функции, използващи името
Abs:
Overloads Public Shared
Function Abs(Decimal) As Decimal
Overloads Public Shared
Function Abs(Double) As Double
Overloads Public Shared
Function Abs(Integer) As Short
Overloads Public Shared
Function Abs(Integer) As Integer
Overloads Public Shared
Function Abs(Long) As Long
Overloads Public Shared
Function Abs(SByte) As SByte
Overloads Public Shared
Function Abs(Single) As Single
Отбележете използването на ключова дума Overloads, която съобщава на VB, че тази
функция е предефинирана (
overloaded).
По дефиниция, име на функция е
предефинирано, ако две дефинирани функции използват едно и също име, но имат
различна аргументна сигнатура (argument signatures). Да вземем функция, която връща
текущия баланс. Сметката може да се идентифицира по-късно по името на лицето
или по номера на сметката. Така можем да дефинираме две функции наречени
GetBalance:
Overloads Function
GetBalance(sCustName As String) As Decimal
Overloads Function
GetBalance(sAccountNumber As Long) As Decimal
Забележете, че VB .NET позволява предефиниране само защото аргументната сигнатура на
двете функции е различна, така че не може да възникне объркване. Викането на функциите:
GetBalance("John
Smith")
GetBalance(123456)
се решава от компилатора без трудности, базирано на типа данни (
data type) на аргумента. Този тип се предефинира, така че
може да кажем,че функцията
(GetBalance) се предефинира. От друга страна имаме две
различни функции, сякаш е по-подходящо да кажем, че името
(name) на функцията се предефинира. Предефинирането (
Overloading) e много общо и не е нещо специално за обектно-ориентираното програмиране.
-
Полиморфизъм -
Polymorphism
Понятието полиморфизъм (polymorphism) означава осъществяване или
преминаване през много различни форми. С други думи казано
Полиморфизмът е възможността да
предефинираме методите на базовия клас. В .NET Framework, полиморфизмът е
свързан директно с наследяемостта. Ключова дума
Inherits позволява на Visual
Basic .NET да изпълнява истински полиморфизъм. Нека пак да се върнем към
примера със
Служител (
Slujasht). Функцията
IncZaplata e
дефинирана в три класа: базовия клас
CSlujasht
и произхождащите класове
CDirector и
CSecretary. Така функцията
IncZaplata взема три форми. Това е полиморфизъм, VB .NET
стил. Някои компютърни учени твърдят,че това е предефиниране (
overloading). Няма да вземаме страна в спора.
Нека да разгледаме пример базиран на ресторант, където имаме
Chovek и клас
Klient. Класът
Klient ще наследи клас
Chovek.
Следният код показва атрибутите на клас
Chovek:
Public Class Chovek
' Chovek class. Този клас симулира клиента (Klient)
Dim m_name As String ' Деклариране на
локалните променливи
Dim m_fname As String
Public Property Familia_name(ByVal
sNameIn As String) As String
Get
Familia_name = m_name
End Get
Set
m_name = sNameIn
End Set
End Property
Public Property Ime_name(ByVal
sFNameIn As String) As String
Get
Ime_name = m_fname
End Get
Set
m_fname = sFNameIn
End Set
End Property
Public Sub eat(ByVal sHrana
As String)
'
'
End Sub
End Class
Както виждаме клас
Klient има свойство
Ime name и свойство
Familia name, както и метод наречен
eat. Метод
eat приема
Hrana като стрингова променлива. Сега да допуснем, че сме продали безалкохолни напитки
на своите потребители (
Klients). Ще се нуждаем
от метод
napitka (само за клас
Klient ). Когато създаваме клас
Klient, можем да добавим клас
napitka:
Public Sub Public Class Klient
Inherits Chovek
Public Sub napitka(ByVal
sSoftNapitka As String)
End Sub
End Class
Класът
Klient съдържа всички свойства и методи на клас
Chovek, както и добавения метод
napitka.
Да допуснем, че продаваме алкохол на някои потребители. В този случай, Можем да се възползваме (
override) от клас
napitka и да го променим. Можем да направим така, че редица вградени (
built-in) методи да са достъпни вътре в класа:
Public Class adultKlient
Inherits Klient
Overrides Sub napitka(ByVal
sSoftNapitka As String, ByVal sBeer As String)
End Sub
End Class
Фигура61Подклас на
Клиент -
Adult Klient Class