ТЕМА14
Обектно програмиране. Клас. Обект. Свойства. Метод
-
Понятие за обектно-ориентирано програмиране
Обектно-ориентираното програмиране се е наложило като стандарт при почти всички съвременни езици за програмиране. То предоставя мощно средство за моделиране на обектите от реалния свят и взаимоотношенията между тях, позволява добро структуриране на програмния код и улеснява неговото преизползване. В основата на ООП стоят обектите, моделиращи обекти от реалния свят и взаимодействията между тях. Това позволява изграждането на софтуерни системи, които въпреки сложността си са разбираеми и в следствие на това - лесни за разширяване и поддръжка. Даден обект, представящ същност от реалния свят, би могъл (почти) без изменения да играе ролята на същия физически обект в друга софтуерна система.
Трите основни принципа на ООП са капсулация на данните, наследяване и полиморфизъм. Те са основните характеристики, които определят един език за програмиране като обектно-ориентиран.
Основна концепция в ООП е обектът да се разглежда като "черна кутия" – използващите обекта "виждат" само атрибутите и операциите, които са присъщи на обекта от реалния свят, без да се интересуват от конкретната им реализация – клиентът на обекта трябва да знае само какво може да прави обектът, а не как го прави. В такъв смисъл "капсулация" означава скриване на ненужните детайли за обектите и откриване към външния свят само на важните техни характеристики и свойства.
Обектите в ООП съдържат своите данни и средствата за тяхната обработката, капсулирани като едно цяло.
Ако един обект съдържа всички свойства и действия на друг, първият може да го наследи. По този начин наследеният обект освен собствените си атрибути и операции приема и тези на "родителя" си (базовия клас), като така се избягва повторното им дефиниране и се позволява създаването на йерархии от класове, моделиращи по естествен начин зависимостите от реалността.
За да изясним това понятие, ще си послужим с класическият в OOП пример за класа от обекти Animal, който представлява абстракция за множеството от всички животни. Всички обекти от този клас имат общи характеристики (например цвят и възраст) и обща функционалност, например операциите Eat и Sleep, докато за класът Dog, представляващ множеството от всички кучета, които също са животни, би могъл да предоставя операциите Eat, Sleep и Bark. Удачно е класът Dog да наследи Animal – тогава той ще съдържа описание само на собственото си действие Bark, докато тези на Eat и Sleep ще получи от базовия си клас.
Полиморфизъм буквално означава приемането на различни форми от един обект. Нека е даден базов клас, представящ категория от обекти, които реализират общо действие, което се наследява от множество класове, описващи по-тесни категории. Въпреки, че те всички споделят това действие, те могат да го реализират по различен начин. Когато разполагаме с обекти от базовия клас, знаем че всички те реализират това действие, независимо на кой наследен клас принадлежат. Поради това можем да го използваме без да се интересуваме от конкретната му реализация. Например, ако класът Animal предоставя действието Talk и разгледаме наследяващите го класове Dog и Cat, всеки от тях го реализира по конкретен начин. И ако имаме животно, което издава звук и то е куче – ще лае, а ако е котка – ще мяучи.
Полиморфизмът позволява унифицираното извършване на действие над различни обекти, които го реализират. В този случай издаването на звук от животно е полиморфно действие – такова, което се реализира по различен начин в различните наследници на базовия клас.
Без да претендираме за изчерпателност ще даден кратка дефиниция за основните понятия от ООП, които ще използваме по-нататък. Ако откривате, че повечето от тези термини са ви напълно непознати, ви препоръчваме първо да се запознаете с принципите на обектно-ориентираното програмиране от някоя специализирана книга по ООП, а след това да продължите нататък. В настоящата тема ще направим преглед на реализацията на ООП в .NET Framework, а не на ООП като идеология.
Класовете са категории от обекти, споделящи общи свойства и операции, които могат да се извършват върху тях. Например класът "студент" представя множеството от всички студенти. Класът не съществува реално като физическа същност, а по-скоро можем да го разгледаме като описание на неговите обекти.
Обект наричаме конкретен елемент от даден клас (инстанция), например студентът Тодор Георгиев, трети курс, ядрена физика в СУ.
Процесът на създаване на обект от даден клас е инстанциране. Обектите, създадени при инстанциране на даден клас, се наричат негови инстанции. Например в резултат от инстанцирането на класа "студент" можем да получим обекта "Иван Петров", който е инстанция на класа "студент".
Свойство се нарича видима за външния свят характеристика (атрибут) на обектите от даден клас. Например свойства на класа "студент" са личните имената му, личните му данни, оценките му и др.
Метод е действие, което всички обекти от даден клас могат да извършват. Например всички обекти от класа "студент" могат да извършват действието "явяване на изпит".
Интерфейсът е описание на съвкупност от действия, които даден обект може да извършва. Ако един обект може да извършва всички действия от даден интерфейс, казваме че обектът реализира, или имплементира интерфейса. Класът "студент", например, би могъл да реализира интерфейса "учащ" съдържащ действието "учене".
Наследяване в ООП наричаме възможността един клас, наричан наследник, да придобие свойства и действия на друг клас – родител (базов клас). Например класът "прекъснал студент" би могъл да наследи класа "студент", като към наследените методи и свойства добави собствени, например "получаване на призовка от военните власти".
Абстракция на данните наричаме възможността да работим с данни без да се интересуваме от тяхното вътрешно представяне, а само от операциите, които можем да извършваме над тях. Удачно е този подход да се осъществи чрез използването на интерфейси.
Структури от данни, които дефинират група от операции, но не разкриват информация как са имплементирани тези операции, се наричат абстрактни структури от данни.
Абстракцията на действията е възможността да изпълняваме действия, без да се интересуваме от конкретната им реализация. Обикновено се постига чрез полиморфизъм. Например ако извикваме даден метод от даден клас през неговия базов клас или интерфейс, ние реално извикваме абстрактно действие от базовия клас, което е реализирано
Visual Basic е обектно-ориентиран език за програмиране, т.е. всичко в него е обект, а целия код е написан за да накара обектите да взаимодействат един с друг, както и с останалия свят. Пример от реалния свят може може да бъде ученик от едно училище. Той има име, егн, месторождение. Ученикът започва да учи и да изпълнява и други дейностти. Една такава функция е участие в спортния отбор на училището.
Всички тези функции и описателни елементи определят ученика като обект, като име, егн, месторождение са неговте атрибути, а реалните функции се определят като методи и събития. Обектите могат да съдържат други обекти. Например ученикът е в различен клас, различни специалности. Във всеки клас има определен брой ученици. Класът в училище е сбор от обекти. Във VB2008 всичко е обект, а целия код е написан, за да накара обектите да взаимодействат един с друг.
Всеки обект има:
-
Определен брой описателни елементи, наречени атрибути (свойства)
-
Методи (подпрограми или функции)
-
Събития (специални подпрограми, свързани с определен брой условия)
Общо тези елементи на всеки обект създават клас. Всички тези елементи на обекта се обединяват за да образуват структурата на един обект. Тази структура при писане на код е дефинирана като клас.
Пример: Контролите са класове и имат:
(Филм VB2005/06VB1- първия филм)
-
Създаване на потребителски клас
Project – Add – Class
Добавя се нов модул за клас с име (зададено от потребителя) и се дефинира като Public, което означава, че всяка част от приложението може да използва класа. Създаването на клас позволява да се дефинират собствени обекти в проекта – такива, които притежават свойства, методи, събития.
-
Атрибути за класа (class)
А) променливи
Добавят се променливи, които съхраняват информацията. Поставят се най-отгоре в структурата на класа и се дефинират по-същият начин като в друг модул.
-
Private (частни) достъпни само в рамките на класа
-
Public (публични) достъпни в класа и всяка част на проекта
-
Friend позволява на други части от проекта да има достъп до променливите
-
Protected разширение на Private и позволява на класовете, които наследяват поведението на други класове, да виждат техните класове.
Всяко свойство има две изявления:
-
Get – показва стойността на полето, когато е поскано
-
Set – преписва стойността в елемента който желаем
Б) създаване на атрибути (свойства)
За да се създаде атрибут се използва структурата Property със следния синтаксис:
Тип Property име()
Get
Return променлива
End Get
Set(ByVal променлива As тип)
променлива = стойност
End Set
End Property
Атрибута трябва да има име и тип, който да указва как може да се достигне до него извън класа. В дефиницията на атрибут кодът трябва да се дефинира какво се връща, в случай че кодът се опита да вземе стойността от атрибута (клаузата Get), както и какво действие трябва да се предприеме, в случай, че друга част от програмата се опита да присвои стойност на атрибута (клаузата Set).
-
Създаване на class – пример
Задача: Създава се проект, който внася собствено, фамилно име и рождена дата на ученици. Пресмята се възрастта на ученицит.
-
Изграждане на проекта Person Class
-
Създайте нов проект с име MyPersonClass
-
Вложете следните контроли:
-
Label1
-
TextBox1
-
TextBox2
-
DateTimePicker
-
Button1
-
Добавете Class от Project с име Person
-
Деклариране на променливите на класа
Private Name1 As String
Private Name2 As String
-
Създаване на свойствата -
Public Property FirstName() As String
Get
Return Name1
End Get
Set(ByVal value As String)
Name1 = value
End Set
End Property
Public Property LastName() As String
Get
Return Name2
End Get
Set(ByVal value As String)
Name2 = value
End Set
End Property
-
Създаване на метод -
Декларира се функция с име Age, която изисква аргумента Birthday от тип Date, за да направи изчисление. Той използва метода Substract, за да извади рождената дата на ученика от текущото системно време, след което връща получената стойност, изразена в дни, разделена на числото 365.25 – приблизителната продължителност на една година (изразена в дни). Функцията Int конвертира тази стойност в цяло число, което се връща на извикващата процедура чрез конструкцията Return.
Public Function Age(ByVal Birthday As Date) As Integer
Return Int(Now.Subtract(Birthday).Days / 365.25)
End Function
End Class
-
Създаване на обект на базата на новия Class
Кликнете два пъти върху Button1 на формата и въведете следния код:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim Employee As New Person
Dim DOB As Date
Employee.FirstName = TextBox1.Text
Employee.LastName = TextBox2.Text
DOB = DateTimePicker1.Value.Date
MsgBox(Employee.FirstName & " " & Employee.LastName _
& " е " & Employee.Age (DOB) & “години”)
End Sub
Този код служи за съхранение на стойностите, въведени от потребителя в обект, наречен Employee и деклариран с тип Teacher. Ключовата дума New указва, че желаете незабавно да създадете нов екземляр на обекта Employee. Сега за първи път декларирате променлива от тип, създаден предварително Class. В кода се декларира променлива от тип Date, която съхранява въведената от потребителя дата. Свойствата FirstName и LastName на обекта Employee са получили собствено и фамилно име.
-
Наследяване на базов клас
-
Използване на ключовата дума Inherits
-
Кликнете в класа Person.vb – View Code и създайте класа Teacher
Public Class Teacher
Inherits Person
Private Level As Short
Public Property Grade() As Short
Get
Return Level
End Get
Set(ByVal value As Short)
Level = value
End Set
End Property
End Class
Конструкцията Inherits свързва Person с въпросния нов клас, като обединява всичките му променливи, свойства и методи. По същество, Teacher е дефиниран като специален тип на класа Person – в допълнение на свопйствата FirstName и LastName, притежава и още едно – Grade, в което се записва класът, в който преподава учителя.
Dim Employee As New Teacher
Dim DOB As Date
Employee.FirstName = TextBox1.Text
Employee.LastName = TextBox2.Text
DOB = DateTimePicker1.Value.Date
Employee.Grade = InputBox("В кой клас преподава?")
MsgBox(Employee.FirstName & " " & Employee.LastName _
& " преподава " & Employee.Grade & "клас")
Достарыңызбен бөлісу: |