2. Съдържание 1/2
• Обектно-ориентирано програмиране
– Какво научихме за него?
– Какво можем да добавим?
• Методи
–
–
–
–
Какво е „метод“?
Деклариране на метод
Използване на членове на същия обект
Използване на членове на друг обект
3. Съдържание 2/2
• Конструктори
–
–
–
–
Какво е „конструктор“?
Деклариране на конструктор
Използване на конструктори
Навързване на конструктори
• Деструктори
– Какво е „деструктор“?
– Деклариране на деструктор
• Ами структурите?!
4. Обектно-ориентирано програмиране
• Какво научихме за него?
– ООП е подход, който представя „света“ като множество от обекти
организирани в класове
– В .NET Framework всичко е обект!
• … един вид…
– Организационна структура
• Класът обединява множество от сходни обекти
• Обектът е представител на класа, към който принадлежи
– Състояние (данни)
• Класът дава описание на данните характеризиращи състоянието на обектите
принадлежащи към този клас (тип и наименование на данните)
• Обектът има състояние определено от конкретните стойности за данните
характерни за класа, към който принадлежи (стойности за данните)
5. Обектно-ориентирано програмиране
• Какво можем да добавим?
– Поведение (програмен код)
• Класът дава възможното поведение на обектите принадлежащи към този клас
• Обектът променя своето състояние и/или състоянието на други обекти в
резултат на своето поведение
– Създаване (инициализация)
• Класът може да определи действията извършвани при създаването на обекти
принадлежащи към този клас
• Класът може да определи начините за създаването на обекти принадлежащи
към този клас
– Унищожаване (освобождаване на ресурси)
• Класът може да определи действията извършвани при унищожаването на
обекти принадлежащи към този клас
6. Методи
• Какво е „метод“? (преговор)
– Методът е член-функция за класа, в който е дефинирана
– Всички функции в езика C# са всъщност методи
– Функцията/методът е последователност от инструкции изпълняващи
дадена задача
• Методите в контекста на ООП
– Методът е начин с програмен код да дефинираме поведение на
обектите от класа, в който е дефиниран съответният метод
– Методът е начин да изменим данните и респективно състоянието
на обекта
– Методите могат да се декларират и съответно изпълняват в
контекста, както на обектите от даден клас, така и в контекста на
класа като цяло
7. Методи
• Деклариране на метод
– (ново) Клас, в който методът е
деклариран
– Тип на данните на връщаната
стойност (или „void” ако няма
такава)
– Наименование
– Описание на параметрите
– Тяло на метода
• Презаписване на методи
– Деклариране на методи с едно
и също наименование, но с
различна сигнатура
// деклариран клас
class Human
{
// …
void SayHello()
{
Console.WriteLine(“Yo, nigga!”);
}
void SayHello(Human nigga)
{
Console.WriteLine(“Yo, {0}!”, nigga);
}
// …
}
8. Методи
• Достъпване на членпроменливи (полета)
– Когато методът се изпълнява в
контекста на обект, ключовата
дума „this“ може да се
използва за достъп до неговите
член-променливи (полета)
class Person
{
// член-променливи (полета)
string _firstName,
_middleName, _lastName;
// член-функция с резултат
string GetFullName()
{
string fullName =
string.Format(“{0} {1} {2}”,
// достъпване на член-променливи
this._firstName,
this._middleName, this._lastName);
return fullName;
}
}
9. Методи
• Използване на членпроменливи (полета) на
същия обект
– Ако обръщението е еднозначно,
ключовата дума „this” може да
се пропусне
class Person
{
// член-променливи (полета)
string _firstName,
_middleName, _lastName;
// член-функция с резултат
string GetFullName()
{
string fullName =
string.Format(“{0} {1} {2}”,
// достъпване на член-променливи
_firstName,
_middleName, _lastName);
return fullName;
}
}
10. Методи
• Използване на член-функции
(методи) на същия обект
– Когато методът се изпълнява в
контекста на обект, ключовата
дума „this“ може да се
използва за достъп до неговите
член-функции (методи)
– Отново, ако обръщението е
еднозначно, ключовата дума
„this” може да се пропусне
class Person
{
// … предишният ни код е някъде тук
// член-функция извикваща друга
void ShowFullName()
{
string fullName = this.GetFullName();
Console.Write(fullName);
}
}
11. Методи
• Използване на член-функции
(методи) на друг обект
class Person
{
// … предишният ни код е някъде тук
– Методи на друг обект се
извикват с използването на
променливата, в която той е
съхранен
// член-функция извикваща друга
void Meet(Person thatPerson)
{
string thisName =
this.GetFullName();
string thatName =
thatPerson.GetFullName();
Console.Write(
“♥ {0} ♥ {1} ♥”,
thisName, thatName);
}
}
13. Конструктори
• Какво е „конструктор“?
– Конструкторът е метод, който се изпълнява при създаването на
обект от съответния клас и служи за инициализация на обекта
– Конструкторът не се извиква явно, а неявно при създаване на обект
с оператора „new”, след заделяне на памет за него
– Конструкторът може да има параметри
– Конструкторът не може да връща резултат
– Конструкторът може да бъде презаписван
– Конструкторът може да извиква други конструктори
– За класовете без изрично деклариран конструктор, се генерира
автоматичен подразбиращ се конструктор (без параметри)
14. Конструктори
• Деклариране на конструктор
– Не се упоменава връщан тип
данни
– Наименованието на
конструктора съвпада с
наименованието на класа
– Описание на параметрите
– Тяло на конструктора
// кръгов конус
class CircularCone
{
// радиус на основата и височина
double _radius, _height;
// ъгъл между височината и оста
double _angle;
CircularCone(double radius,
double height, double angle = 0)
{
// инициализация
_radius = radius;
_height = height;
_angle = angle;
}
}
15. Конструктори
• Деклариране на конструктор
// триъгълник
class Triangle
– Един клас може да има повече
{
от един конструктор
// страни на триъгълника
double _a, _b, _c;
– Конструкторът може да бъде
Triangle(double a, double b, double c)
презаписан, както обикновените
{
методи
// …
}
Triangle(double ax, double ay,
double bx, double by,
double cx, double cy)
{
// …
}
}
16. Конструктори
• Използване на конструктори
– Оператор „new”
– Наименованието на
класа/конструктора
– Списък от аргументи
// извикване на конструктор без параметър
Person person = new Person();
// извикване на конструктор с параметри
CircularCone cone = new CircularCone(
0.5, 1);
// извикване на презаписан конструктор
Triangle triangle1 = new Triangle(
3, 4, 5);
Triangle triangle2 = new Triangle(
0, 0,
4, 0,
4, 3);
17. Конструктори
• Навързване на конструктори
– Понякога имаме няколко
конструктора с повтаряща се
логика
– За да спестим повторението на
код, можем да използваме
навързване на конструктори
– Навързването на конструктори
представлява извикване на един
конструктор от друг
class GeoLocation
{
// геогр. дължина, широчина и височина
double _lng, _lat, _alt;
// само с геор. дължина и широчина
GeoLocation(double lng, double lat)
{
_lng = lng; _lat = lat; _alt = 0;
}
// с геогр. дължина, широчина и височина
GeoLocation(double lng, double lat,
double alt)
{
_lng = lng; _lat = lat; _alt = alt;
}
}
18. Конструктори
• Навързване на конструктори
– Понякога имаме няколко
конструктора с повтаряща се
логика
– За да спестим повторението на
код, можем да използваме
навързване на конструктори
– Навързването на конструктори
представлява извикване на един
конструктор от друг
class GeoLocation
{
// геогр. дължина, широчина и височина
double _lng, _lat, _alt;
// само с геор. дължина и широчина
GeoLocation(double lng, double lat)
: this(lng, lat, 0)
{
}
// с геогр. дължина, широчина и височина
GeoLocation(double lng, double lat,
double alt)
{
_lng = lng; _lat = lat; _alt = alt;
}
}
20. Деструктори
• „Човек и добре да живее, умира и друг се ражда.“ –
Омуртаг
– Приживе обектите могат да заемат ресурси, които .NET Framework
не може да управлява – наследство, което трябва да се освободи
• Какво е „деструктор”?
– Деструкторът е метод, който се изпълнява при изчистването и
освобождаването на паметта заемана от обекта
– Деструкторът не се извиква явно, а автоматично т.нар. “garbage
collector”
– Деструкторът може да бъде само един за даден клас
– Деструкторът няма параметри
– Деструкторите не могат да бъдат презаписвани
21. Деструктори
• Деклариране на деструктор
– Символ “~” (тилда)
– Наименованието на
деструктора съвпада с
наименованието на класа
– Празен списък от параметри
– Тяло на деструктора
class Marriage
{
// конструктор на брак
Marriage(string husband, string wife)
{
Console.WriteLine(
”And they lived happily ever
after…”);
}
// деструктор на брак
~Marriage()
{
Console.WriteLine(
“Till death did them part!“);
}
}
22. Ами структурите?!
• Структурите имат особености/ограничения в сравнение с
класовете
– Структурите могат да декларират методи
– Структурите могат да се конструират и без оператора “new”
– Структурите не могат да декларират подразбиращ се конструктор
(без параметри)
– Структурите могат да декларират конструктори
– Структурите не могат да декларират деструктори
23. Задачи за упражнение
• Създайте структура Point2D, която описва точка в
двумерното пространство
– Изберете подходящо вътрешно представяне на точката
– Добавете конструктор с два параметъра – планарни координати
на точката (x, y)
– Добавете конструктор с три параметъра – един от изброим списък
указващ координатната система и два за самите координати
(планарни (x,y) или полярни (r, phi))
– Добавете метод, който връща планарните координати (x, y) на
точката
– Добавете метод, който връща полярните координати (r, phi) на
точката
– Добавете метод, който връща разстоянието до друга точка Point2D
24. Задачи за упражнение
• Създайте клас Vector2D, който описва вектор в двумерното
пространство
– Изберете подходящо вътрешно представяне на вектора
– Добавете конструктор с два параметъра – компоненти на вектора
в декартова координатна система (x, y)
– Добавете конструктор с три параметъра – един от изброим списък
указващ координатната система и два за самите компоненти
(планарни (x,y) или полярни (r, phi))
– Добавете методи за транслация и ротация на вектора
– Добавете метод, който прибавя/изважда друг вектор
– Добавете метод, който връща точка получена от преместването на
подадена точка с настоящия вектор
25. Задачи за упражнение
• Създайте програма съдържаща класове за различни
основни двумерни и тримерни геометрични фигури
– Добавете подходящите конструктори
– Добавете полета описващи характеристиките на съответните
фигури
– Добавете методи за изчисляване на повърхнина и обем на тези,
които имат такива
– Такива класове могат да бъдат:
•
•
•
•
Point2D и Vector2D съответно за точка и вектор в двумерното пространство
Parallelogram за успоредник, Ellipse за елипса
Point3D и Vector3D съответно за точка и вектор в тримерното пространство
Cone за конус, Parallelepiped за паралелепипед, Pyramid за пирамида,
Ellipsoid за елипсоид
26. Задачи за упражнение
• Създайте програма за управление на софтуерна академия
–
–
–
–
Създайте клас Student, който описва учащ
Създайте клас Course, който описва курс
Създайте клас Academy, който описва софтуерна академия
Класът Student:
• Съдържа пореден номер, имена и списък от курсове
• Декларира метод за записване на курс, подаден като параметър
– Класът Course:
• Съдържа наименование, e-mail и списък от записани учащи
• Декларира метод за записване на учащ, подаден като параметър
– Класът Academy:
• Съдържа наименование, списък от курсове и учащи
• Декларира методи за добавяне на курс/учащ и записване