Помогни ни да направим Uroci.net по - богат! Добави урок

Полиморфизъм

bubust   трудност:    видян: 4028

Няма да влизаме в подробности, защото някои компютърни учени разглеждат 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




Регистрирайте се, за да добавите коментар


Калдейта ЕООД - © 2003-2010. Всички права запазени.
Препоръчваме: Национален Бизнес | Bomba.bg | IT Новини | Диплома.бг | TRAVEL туризъм | Реферати | AmAm.bg | Иде.ли | Курсови работи | Фото Форум | Spodeli.net | Фото-Култ | Atol.bg | Elmaz.com | MobileBulgaria.com | Казанлък.Com