Курс по програмиране на C#
Занятие №8
Методи. Конструктори и деструктори

2013
Съдържание 1/2
• Обектно-ориентирано програмиране
– Какво научихме за него?
– Какво можем да добавим?

• Методи
–
–
–
–

Какво е „метод“?
Деклариране на метод
Използване на членове на същия обект
Използване на членове на друг обект
Съдържание 2/2
• Конструктори
–
–
–
–

Какво е „конструктор“?
Деклариране на конструктор
Използване на конструктори
Навързване на конструктори

• Деструктори
– Какво е „деструктор“?
– Деклариране на деструктор

• Ами структурите?!
Обектно-ориентирано програмиране
• Какво научихме за него?
– ООП е подход, който представя „света“ като множество от обекти
организирани в класове
– В .NET Framework всичко е обект!
• … един вид… 

– Организационна структура
• Класът обединява множество от сходни обекти
• Обектът е представител на класа, към който принадлежи

– Състояние (данни)
• Класът дава описание на данните характеризиращи състоянието на обектите
принадлежащи към този клас (тип и наименование на данните)
• Обектът има състояние определено от конкретните стойности за данните
характерни за класа, към който принадлежи (стойности за данните)
Обектно-ориентирано програмиране
• Какво можем да добавим?
– Поведение (програмен код)
• Класът дава възможното поведение на обектите принадлежащи към този клас
• Обектът променя своето състояние и/или състоянието на други обекти в
резултат на своето поведение

– Създаване (инициализация)
• Класът може да определи действията извършвани при създаването на обекти
принадлежащи към този клас
• Класът може да определи начините за създаването на обекти принадлежащи
към този клас

– Унищожаване (освобождаване на ресурси)
• Класът може да определи действията извършвани при унищожаването на
обекти принадлежащи към този клас
Методи
• Какво е „метод“? (преговор)
– Методът е член-функция за класа, в който е дефинирана
– Всички функции в езика C# са всъщност методи
– Функцията/методът е последователност от инструкции изпълняващи
дадена задача

• Методите в контекста на ООП
– Методът е начин с програмен код да дефинираме поведение на
обектите от класа, в който е дефиниран съответният метод
– Методът е начин да изменим данните и респективно състоянието
на обекта
– Методите могат да се декларират и съответно изпълняват в
контекста, както на обектите от даден клас, така и в контекста на
класа като цяло
Методи
• Деклариране на метод
– (ново) Клас, в който методът е
деклариран
– Тип на данните на връщаната
стойност (или „void” ако няма
такава)
– Наименование
– Описание на параметрите
– Тяло на метода

• Презаписване на методи
– Деклариране на методи с едно
и също наименование, но с
различна сигнатура

// деклариран клас
class Human
{
// …
void SayHello()
{
Console.WriteLine(“Yo, nigga!”);
}
void SayHello(Human nigga)
{
Console.WriteLine(“Yo, {0}!”, nigga);
}
// …
}
Методи
• Достъпване на членпроменливи (полета)
– Когато методът се изпълнява в
контекста на обект, ключовата
дума „this“ може да се
използва за достъп до неговите
член-променливи (полета)

class Person
{
// член-променливи (полета)
string _firstName,
_middleName, _lastName;
// член-функция с резултат
string GetFullName()
{
string fullName =
string.Format(“{0} {1} {2}”,
// достъпване на член-променливи
this._firstName,
this._middleName, this._lastName);
return fullName;
}
}
Методи
• Използване на членпроменливи (полета) на
същия обект
– Ако обръщението е еднозначно,
ключовата дума „this” може да
се пропусне

class Person
{
// член-променливи (полета)
string _firstName,
_middleName, _lastName;
// член-функция с резултат
string GetFullName()
{
string fullName =
string.Format(“{0} {1} {2}”,
// достъпване на член-променливи
_firstName,
_middleName, _lastName);
return fullName;
}
}
Методи
• Използване на член-функции
(методи) на същия обект
– Когато методът се изпълнява в
контекста на обект, ключовата
дума „this“ може да се
използва за достъп до неговите
член-функции (методи)
– Отново, ако обръщението е
еднозначно, ключовата дума
„this” може да се пропусне

class Person
{
// … предишният ни код е някъде тук

// член-функция извикваща друга
void ShowFullName()
{
string fullName = this.GetFullName();
Console.Write(fullName);
}
}
Методи
• Използване на член-функции
(методи) на друг обект

class Person
{
// … предишният ни код е някъде тук

– Методи на друг обект се
извикват с използването на
променливата, в която той е
съхранен

// член-функция извикваща друга
void Meet(Person thatPerson)
{
string thisName =
this.GetFullName();
string thatName =
thatPerson.GetFullName();
Console.Write(
“♥ {0} ♥ {1} ♥”,
thisName, thatName);
}
}
Методи - демо
// Демонстрация
Конструктори
• Какво е „конструктор“?
– Конструкторът е метод, който се изпълнява при създаването на
обект от съответния клас и служи за инициализация на обекта
– Конструкторът не се извиква явно, а неявно при създаване на обект
с оператора „new”, след заделяне на памет за него
– Конструкторът може да има параметри
– Конструкторът не може да връща резултат
– Конструкторът може да бъде презаписван
– Конструкторът може да извиква други конструктори
– За класовете без изрично деклариран конструктор, се генерира
автоматичен подразбиращ се конструктор (без параметри)
Конструктори
• Деклариране на конструктор
– Не се упоменава връщан тип
данни
– Наименованието на
конструктора съвпада с
наименованието на класа
– Описание на параметрите
– Тяло на конструктора

// кръгов конус
class CircularCone
{
// радиус на основата и височина
double _radius, _height;
// ъгъл между височината и оста
double _angle;
CircularCone(double radius,
double height, double angle = 0)
{
// инициализация
_radius = radius;
_height = height;
_angle = angle;
}
}
Конструктори
• Деклариране на конструктор

// триъгълник
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)
{
// …
}
}
Конструктори
• Използване на конструктори
– Оператор „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);
Конструктори
• Навързване на конструктори
– Понякога имаме няколко
конструктора с повтаряща се
логика
– За да спестим повторението на
код, можем да използваме
навързване на конструктори
– Навързването на конструктори
представлява извикване на един
конструктор от друг

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;
}
}
Конструктори
• Навързване на конструктори
– Понякога имаме няколко
конструктора с повтаряща се
логика
– За да спестим повторението на
код, можем да използваме
навързване на конструктори
– Навързването на конструктори
представлява извикване на един
конструктор от друг

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;
}
}
Конструктори - демо
// Демонстрация
Деструктори
• „Човек и добре да живее, умира и друг се ражда.“ –
Омуртаг
– Приживе обектите могат да заемат ресурси, които .NET Framework
не може да управлява – наследство, което трябва да се освободи

• Какво е „деструктор”?
– Деструкторът е метод, който се изпълнява при изчистването и
освобождаването на паметта заемана от обекта
– Деструкторът не се извиква явно, а автоматично т.нар. “garbage
collector”
– Деструкторът може да бъде само един за даден клас
– Деструкторът няма параметри
– Деструкторите не могат да бъдат презаписвани
Деструктори
• Деклариране на деструктор
– Символ “~” (тилда)
– Наименованието на
деструктора съвпада с
наименованието на класа
– Празен списък от параметри
– Тяло на деструктора

class Marriage
{
// конструктор на брак
Marriage(string husband, string wife)
{
Console.WriteLine(
”And they lived happily ever
after…”);
}
// деструктор на брак
~Marriage()
{
Console.WriteLine(
“Till death did them part!“);
}
}
Ами структурите?!
• Структурите имат особености/ограничения в сравнение с
класовете
– Структурите могат да декларират методи
– Структурите могат да се конструират и без оператора “new”
– Структурите не могат да декларират подразбиращ се конструктор
(без параметри)
– Структурите могат да декларират конструктори
– Структурите не могат да декларират деструктори
Задачи за упражнение
• Създайте структура Point2D, която описва точка в
двумерното пространство
– Изберете подходящо вътрешно представяне на точката
– Добавете конструктор с два параметъра – планарни координати
на точката (x, y)
– Добавете конструктор с три параметъра – един от изброим списък
указващ координатната система и два за самите координати
(планарни (x,y) или полярни (r, phi))
– Добавете метод, който връща планарните координати (x, y) на
точката
– Добавете метод, който връща полярните координати (r, phi) на
точката
– Добавете метод, който връща разстоянието до друга точка Point2D
Задачи за упражнение
• Създайте клас Vector2D, който описва вектор в двумерното
пространство
– Изберете подходящо вътрешно представяне на вектора
– Добавете конструктор с два параметъра – компоненти на вектора
в декартова координатна система (x, y)
– Добавете конструктор с три параметъра – един от изброим списък
указващ координатната система и два за самите компоненти
(планарни (x,y) или полярни (r, phi))
– Добавете методи за транслация и ротация на вектора
– Добавете метод, който прибавя/изважда друг вектор
– Добавете метод, който връща точка получена от преместването на
подадена точка с настоящия вектор
Задачи за упражнение
• Създайте програма съдържаща класове за различни
основни двумерни и тримерни геометрични фигури
– Добавете подходящите конструктори
– Добавете полета описващи характеристиките на съответните
фигури
– Добавете методи за изчисляване на повърхнина и обем на тези,
които имат такива
– Такива класове могат да бъдат:
•
•
•
•

Point2D и Vector2D съответно за точка и вектор в двумерното пространство
Parallelogram за успоредник, Ellipse за елипса
Point3D и Vector3D съответно за точка и вектор в тримерното пространство
Cone за конус, Parallelepiped за паралелепипед, Pyramid за пирамида,
Ellipsoid за елипсоид
Задачи за упражнение
• Създайте програма за управление на софтуерна академия
–
–
–
–

Създайте клас Student, който описва учащ
Създайте клас Course, който описва курс
Създайте клас Academy, който описва софтуерна академия
Класът Student:
• Съдържа пореден номер, имена и списък от курсове
• Декларира метод за записване на курс, подаден като параметър

– Класът Course:
• Съдържа наименование, e-mail и списък от записани учащи
• Декларира метод за записване на учащ, подаден като параметър

– Класът Academy:
• Съдържа наименование, списък от курсове и учащи
• Декларира методи за добавяне на курс/учащ и записване
Въпроси?
Благодаря!
• Валери Дачев
– valery@david.bg
– @vdachev
– https://facebook.com/vdachev

• ДАВИД академия
–
–
–
–

acad@david.bg
http://acad.david.bg/
@david_academy
https://facebook.com/DavidAcademy

Училищен курс по програмиране на C# (2013/2014), занятие №8

  • 1.
    Курс по програмиранена C# Занятие №8 Методи. Конструктори и деструктори 2013
  • 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); } }
  • 12.
    Методи - демо //Демонстрация
  • 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; } }
  • 19.
  • 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: • Съдържа наименование, списък от курсове и учащи • Декларира методи за добавяне на курс/учащ и записване
  • 27.
  • 28.
    Благодаря! • Валери Дачев –valery@david.bg – @vdachev – https://facebook.com/vdachev • ДАВИД академия – – – – acad@david.bg http://acad.david.bg/ @david_academy https://facebook.com/DavidAcademy

Editor's Notes

  • #21 Неуправлявани ресурси – прозорци, файлове, мрежови връзки, COM обекти и т.н.