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

Класове и обекти

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



Обекти

Класът е само описание на свойства и методи и няма собствен живот (С изключение на споделените членове - shared members, които дискутираме по-късно). За да се изпълнят методите и да се използват свойствата на класа, трябва да създадем инстанция (instance) на класа, официално известна като обект (object).

Създаването на инстанция на класа е свързана с инстанцирането (instancing), на класа.

Има три способа за инстанциране на обект от VB .NET клас. Първият начин е първо да се декларира променлива от тип клас:

Dim AChovek As CChovek

и след това да се инстанцира обект чрез ключова дума New:

AChovek = New CChovek( )

Можем да комбинираме тези две стъпки така:

Dim AChovek As New CChovek( )

или:

Dim AChovek As CChovek = New CChovek( )



Свойства

Свойствата (Properties) са членове, които могат да бъдат изпълнени по два различни начина. Най-простичко като публична променлива:

Public Class CChovek

Public Vuzrast As Integer

End Class

Проблемът с това изпълнение на свойство Vuzrast, е че се нарушава принципа на капсулацията; всеки, който има достъп до обект CChovek може да промени свойство Vuzrast във всяко цяло число (Integer стойност), даже и отрицателни числа, които не са валидни възрасти - Vuzrasts. Накратко, няма възможност за валидизация на данните. (Нещо повече няма да позволи включването в публичен интерфейс на класа.)

"Подходящият" обектно-ориентиран начин за изпълнение на свойство е използването на Private със специална двойка функции. Типът данни Private съдържа стойността на свойството; чифтът функции, наричани accessors, се използват да получават (get) и установяват (set) стойността на свойството. Така се разработва капсулация на данни, тъй като се ограничава достъпът до свойството чрез кода във функциите за достъп (accessor functions), който може да съдържа код за валидизация на данните. Следният код изпълнява свойство Vuzrast.

Private miVuzrast As Integer

Property Vuzrast( ) As Integer

Get

Vuzrast = miVuzrast

End Get

Set(ByVal Value As Integer)

' валидизация

If Value < 0 Then

MsgBox("Vuzrast cannot be negative.")

Else

miVuzrast = Value

End If

End Set

End Property

VB има специален синтаксис за дефиниране на достъп до свойство (property accessor).

В момента, в който напишем реда:

Property Vuzrast( ) As Integer

интегрираната развойна среда VB IDE автоматично създава следния шаблон:

Property Vuzrast( ) As Integer

Get

End Get

Set(ByVal Value As Integer)

End Set

End Property

Забележете параметъра Value който провежда достъпа до постъпващата стойност. Така ние записваме:

Dim cp As New CChovek( )

cp.Vuzrast = 20

след това VB подава стойността 20 на аргумента Value на процедурата (Property procedure).



Инстанцирани и споделени членове (Instance and Shared Members)

Членовете на класа попадат в две категории:

Instance members - инстанцирани членове

Членове, които могат да се достигнат само чрез инстанция на класа, или чрез обект на класа. С други думи казано, инстанцираните членове "принадлежат" по-скоро на индивидуалния обект, отколкото на класа като цяло.

Shared (static) members - споделени членове

Членове, които могат да се достигнат без да се създава инстанция на класа. Тези членове се споделят от всички инстанции на класа. Ако искаме да сме съвсем коректни, те са независими от отделния обект на класа. С други думи казано, споделените членове "принадлежат" по-скоро на класа като цяло, отколкото на неговите индивидуални обекти или инстанции.

Достъпът до инстанцираните членове става чрез квалифициране на името с обектното име. Примерно:

Dim AChovek As New CChovek( )

AChovek.Vuzrast = 50

Достъпът до споделените членове става чрез квалифициране на члена с името на класа. Например, класът String в системното пространство за имена (System namespace) на библиотека .NET Base Class Library има споделен метод наречен Compare, сравняващ два стринга. Синтаксисът е:

Public Shared Function Compare(String, String) As Integer

Тази функция връща 0, ако стринговете са еднакви, -1 ако първият стринг е по-малък от втория, а 1 ако първият стринг е по-голям от втория. Понеже методът е споделен, можем да запишем:

Dim s As String = "stefan"

Dim t As String = "Ivana"

MsgBox(String.Compare(s, t)) ' Displays 1

Отбележете, че начинът по който метод Compare е квалифициран е с името на класа String. Да предположим, че искаме да имаме сведение за броя на обектите CChovek по всяко време. Тогава пишем кода:

' деклариране на Private shared variable за поместване на броя на инстанции

Private Shared miInstanceCount As Integer

' увеличаване с 1 на броя в конструктора

Sub new( )

miInstanceCount += 1

End Sub

' функция за получаване на броя на инстанции

Shared Function GetInstanceCount( ) As Integer

Return miInstanceCount

End Function

' намаляване с 1 на броя в деструктора

Overrides Protected Sub Finalize( )

miInstanceCount -= 1

MyBase.Finalize

End Sub

Eто достъп до споделена променлива:

Dim stefan As New CChovek( )

MsgBox(CChovek.GetInstanceCount) ' извежда 1

Dim ivana As New CChovek( )

MsgBox(CChovek.GetInstanceCount) ' извежда 2



Клас конструктори - Class Constructors

Когато се създава обект от даден клас, компилаторът вика специална функция, наречена клас конструктор (class' constructor ; instance constructor). Конструкторите могат да се използват за инициализиране на обекти, когато е необходимо. Можем да дефинираме конструктори в клас модула. Даже, ако решим да не използваме конструктор, VB ще използва по подразбиране (default constructor). Например реда:

Dim AChovek As CChovek = New CChovek( )

извиква конструктора по подразбиране на вашия клас CChovek, защото не дефинирахме собствен конструктор.

За да се дефинира собствен конструктор, просто се дефинира подпрограма с име New вътре в клас модула. Да предположим, че искаме да установим свойство Name в конкретна стойност, когато се създаде обект CChovek за първи път. Можем да добавим следния код към класа CChovek:

' потребителски конструктор

Sub New(ByVal sName As String)

Me.Name = sName

End Sub

Сега можем да създадем обект CChovek и да установим името му:

Dim AChovek As CChovek = New CChovek("Dragan")

или:

Dim AChovek As New CChovek("Dragan")

Понеже VB .NET поддържа предефиниране на функциите - overloading, можем да дефинираме много конструктори в един клас, ако всеки конструктор има уникална сигнатура аргументи. След това можем да извикаме всеки собствен конструктор чрез поддържане на коректния брой и тип аргументи за този конструктор.

Ако вече сме дефинирали един или повече собствени конструктори (custom constructors), не можем повече да извикаме конструктор по подразбиране - default (без параметри) по този начин:

Dim AChovek As New CChovek( )

Наместо това, за да извикаме конструктор без параметри, трябва специално да добавим конструктор към клас модула:

' конструктор по подразбиране - Default constructor

Sub New( )

...

End Sub


Страници: «1 2 3 »

Сподели урока:



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


Калдейта Ком ЕООД - © 2003-. Всички права запазени.
Препоръчваме: IT Новини