Занятие №6 на курса по програмиране на C# 2013 провеждан от ДАВИД академия в ПМГ "Никола Обрешков" - Казанлък. Включва темите:
- Обектно-ориентирано програмиране
- Класове и обекти
- Членове
- Видимост и капсулиране
4. Обектно-ориентирано програмиране
•
•
•
•
•
ООП е парадигма в програмирането
Програмният код се разбива на части (обекти)
Обектите се характеризират с данни и функции
Обектите си взаимодействат
Капсулиране, наследяване и полиморфизъм
5. Кратка история на ООП
•
•
•
•
Simula 67 – първи стъпки
Smalltalk – чистият ООП език
C++, Delphi, Objective-C
Java, C#.NET, Python, Ruby
6. Защо използваме ООП?
• Улеснява разпределянето на разработката между
екип от разработчици
• Изолира промените в отделна част от
програмата
• Човешкият ум разсъждава модулно
7. Класове
• Какво е „клас“?
– Категория от обекти
– Описва характеристики и поведение – член-данни и
член-функции
– Референтен тип данни
– Може да наследи друг клас
8. Класове
• Деклариране на класове
– Ключова дума class
– Наименование – съществително или фраза в Pascal
case
– Базов клас и имплементирани интерфейси
(незадължително)
– Блок с декларации на членове
10. Обекти
• Какво е „обект“?
–
–
–
–
Променлива с тип данни клас
Нарича се още инстанция на класа
Съдържа конкретни стойности на член-данните
Може няколко променливи да сочат към един и същи
обект в паметта
11. Обекти
• Създаване (инстанциране) на обекти
– Оператор new
– Наименование на класа
– Списък от аргументи
Animal beetle;
beetle = new Animal();
Animal centipede = new Animal();
12. Структури
• Какво е „структура“?
–
–
–
–
Нереферентен тип данни
Член-данни и член-функции
Задължително наследява System.ValueType
Сравнява се по стойност
13. Структури
• Деклариране на структури
– Ключова дума struct
– Наименование – съществително или фраза в Pascal
case
– Блок с декларации на членове
struct Book
{
// Членове
}
14. Полета
• Какво е „поле“?
–
–
–
–
–
Член-данна
Съхранява характеристика на обекта
Променлива в рамките на обекта
Тип данни и наименование
Уникалност на наименованието
15. Полета
• Деклариране на полета
– Подобно на декларирането на променлива
– Тип данни
– Наименование
class Animal
{
public int Age;
}
16. Полета
• Деклариране с инициализация
class Dog
{
public int LegsCount = 4;
}
• При липса на инициализация – стойност по
подразбиране на типа данни
17. Полета
• Полета само за четене
class Universe
{
public readonly int Answer = 42;
}
• Стойност се присвоява само чрез
инициализация или в конструктор
18. Полета
• Достъпване на полета на обект – с оператора .
Animal cow = new Animal();
cow.Age = 5;
Console.WriteLine(cow.Age);
19. Методи
• Какво е „метод“?
– Член-функция
– Описва поведение
– Наименование, параметри и тип на връщания
резултат
– Всички функции в C# са методи
– Повече от един метод с еднакви наименования но
различни параметри
20. Методи
• Деклариране на методи
–
–
–
–
Тип на връщания резултат
Наименование
Списък от параметри
Тяло (блок от операции)
21. Методи
class Dog
{
public void Bark()
{
Console.WriteLine("Woof woof!");
}
public void Bite(string someone)
{
Console.WriteLine("I bit {0} and I liked it.", someone);
}
public string AskForDirections()
{
return "Woof?";
}
}
22. Методи
• Ключовата дума this служи за достъпване на
членовете на обекта, чийто метод се изпълнява
class Animal
{
public int Age;
public bool CheckIfOld()
{
return (this.Age >= 10);
}
}
23. Методи
• Членовете на текущия обект могат да бъдат
достъпвани и директно – с наименованията си
class Animal
{
public int Age;
public bool CheckIfOld()
{
return (Age >= 10);
}
}
24. Методи
• Достъпването чрез this гарантира еднозначност
на наименованието
class Animal
{
public int Age;
public bool CheckIfOld()
{
int Age = 3;
return (this.Age >= 10);
}
}
25. Конструктори
• Какво е „конструктор“?
– Член, който служи за инициализация
– Не се изпълнява явно, както останалите методи
– Изпълнява се след заделянето на памет с оператора
new
– Има параметри
– Няколко конструктора с различни параметри
– Един конструктор може да изпълнява друг
– Автоматично генериран конструктор без параметри
26. Конструктори
• Деклариране на конструктори
– Наименование на класа
– Списък от параметри
– Тяло (блок от операции)
class Dog
{
public string Name;
public int LegsCount;
public Dog(string name, int legsCount)
{
Name = name;
LegsCount = legsCount;
}
}
27. Конструктори
• Изпълняване на друг конструктор – с ключовата
дума this и списък от аргументи преди тялото
class Dog
{
public string Name;
public int LegsCount;
public Dog(string name)
: this(name, 4)
{
}
public Dog(string name, int legsCount)
{
Name = name;
LegsCount = legsCount;
}
}
28. Конструктори
• Използване на конструктори
– Операторът new
– Наименование на класа или структурата
– Списък от аргументи
Dog rex = new Dog("Rex");
Dog tripod = new Dog("Tripod", 3);
29. Статични членове
• Какво е „статичен“ член?
– Член, който не е обвързан с инстанция на класа
– Всеки от изброените видове членове може да бъде
статичен
– Маркират се с ключовата дума static
– Достъпват се чрез наименованието на класа и
оператора .
30. Статични членове
• Статични полета
– Променливи в рамките на самия клас, а не на негов
обект
– Полезни за споделяне на информация между
обектите
– Полезни за съхранение на данни, използвани от
статични методи
– Константните полета са статични
31. Статични членове
• Статични полета
class Animal
{
public static int AnimalCount = 0;
public Animal()
{
AnimalCount++;
}
}
// Достъпване на статично поле
Console.WriteLine(Animal.AnimalCount);
32. Статични членове
• Статични методи
– Не се изпълняват в контекста на конкретен обект
– Не може да се прилага ключовата дума this
– Не може да се борави пряко с нестатични членове на
класа
– Главната функция на всяка програма е статичен метод
33. Статични членове
• Статични методи
class Animal
{
public static int AnimalCount = 0;
public Animal()
{
AnimalCount++;
}
public static bool AreThereAnyAnimals()
{
return (AnimalCount > 0);
}
}
34. Статични членове
• Статични конструктори
– Нямат параметри
– Не повече от един за всеки клас
– Изпълняват се при първоначално зареждане на класа
в паметта
– Служат за инициализиране на статични полета
35. Статични членове
• Статични конструктори
class Animal
{
public static int AnimalCount;
static Animal()
{
AnimalCount = 0;
}
public Animal()
{
AnimalCount++;
}
}
36. Презаписване на оператори
• Какво е „презаписване“ (overloading) на
оператори?
– Позволява на стандарните оператори да се прилагат
върху данни, декларирани от програмиста
– По подразбиране повечето оператори не могат да
бъдат прилагани върху такива класове
37. Презаписване на оператори
• Деклариране на презаписани оператори
–
–
–
–
–
–
–
–
Сходно с декларирането на статичен метод
Ключовата дума static
Тип на връщаните данни
Ключовата дума operator
Оператор, който ще бъде презаписан
Списък от параметри
Тяло (блок от операции)
Възможно е един оператор да бъде презаписан
няколко пъти с различни параметри
38. Презаписване на оператори
class Rational
{
public int Numerator;
public int Denominator;
public Rational(int numerator, int denominator)
{
Numerator = numerator;
Denominator = denominator;
}
public static Rational operator +(Rational number1, int number2)
{
return new Rational(number1.Numerator * number2, number1.Denominator);
}
public static Rational operator +(Rational number1, Rational number2)
{
int sumNumerator = number1.Numerator * number2.Denominator
+ number2.Numerator * number1.Denominator;
int sumDenominator = number1.Denominator * number2.Denominator;
return new Rational(sumNumerator, sumDenominator);
}
}
39. Презаписване на оператори
• Презаписване на превръщания между типове
–
–
–
–
–
–
Ключовата дума static
Една от ключовите думи implicit или explicit
Ключовата дума operator
Резултатен тип от превръщането
Параметър – начален тип на превъщането
Тяло (блок от операции)
40. Презаписване на оператори
• Презаписване на превръщания между типове
public static implicit operator double(Rational number)
{
return (double)number.Numerator /
(double)number.Denominator;
}
public static explicit operator int(Rational number)
{
return number.Numerator / number.Denominator;
}
41. Видимост
• Какво е „видимост“?
– Определя кои части на програмата имат достъп до
съответния тип данни или член
– Компилаторът следи за нарушаване на тези
органичения
– Полезно за предотвратяването на нежелани действия
с типа или члена
– Задава се с модификатори за достъп
42. Видимост
• Видимост на типове данни – модификаторът за
достъп се поставя в началото на декларацията
им
– Публични – public
– Вътрешни – internal
• Когато не е указан модификатор за достъп, типът
данни по подразбиране е вътрешен
43. Видимост
• Видимост на членове – модификаторът за достъп
се поставя в началото на декларацията им
–
–
–
–
–
Публични – public
Защитени – protected
Частни – private
Вътрешни – internal
Защитени или вътрешни – protected internal
• Когато не е указан модификатор за
достъп, членът по подразбиране е частен
44. Капсулиране
• Какво е „капсулиране“?
– Един от основните принципи на ООП
– Предоставя се достъп единствено до
функционалността, която е проектиран да реализира
класът
– Ограничава се достъпът до данните на обектите
– Ограничава се достъпът до помощните методи, които
не са необходими на външния свят
45. Капсулиране
• Ползи от капсулирането
– Предотвратява нежелани намеси във вътрешната
реализация на обектите
– Опростява взаимодействието на външния свят с
обекта – видими са единствено членовете, които са
необходими за боравене с обекта
– Позволява промяна на вътрешната реализация на
обекта, без да се налагат промени в останалите части
на програмата
46. Капсулиране
• Конвенция за капсулиране
– Полетата на класовете са винаги частни
– Достъпът до полетата се извършва през конструктори,
методи, свойства или индексатори с необходимата
видимост
– Не се предоставят повече видими членове, отколкото
са необходими за боравене с обекта
47. Капсулиране
public class Dog
{
private readonly string _name;
private readonly int _age;
private readonly int _legsCount;
public Dog(string name, int age)
: this(name, age, 4)
{
}
public Dog(string name, int age, int legsCount)
{
_name = name;
_age = age;
_legsCount = legsCount;
}
public string GetName()
{
return _name;
}
48. Капсулиране
public int GetAge()
{
return _age;
}
public int GetLegsCount()
{
return _legsCount;
}
public void Bark()
{
Console.WriteLine("{0} barks: Woof woof!", _name);
}
public void Lick(string someone)
{
Console.WriteLine("{0} licks {1}'s face. Yuck!", _name, someone);
}
}