Upload
david-academy
View
360
Download
5
Embed Size (px)
DESCRIPTION
Занятие №6 на курса по програмиране на C# 2013 провеждан от ДАВИД академия в ПМГ "Никола Обрешков" - Казанлък. Включва темите: - Обектно-ориентирано програмиране - Класове и обекти - Членове - Видимост и капсулиране
Citation preview
2013Copyright © 2013 DAVID Holding Company
Курс по програмиране на C#
Занятие №6Обектно-ориентирано
програмиране.Класове и обекти. Членове.
Видимост и капсулиране
Copyright © 2013 DAVID Holding CompanyCopyright © 2013 DAVID Holding Company
Съдържание 1/2
• Обектно-ориентирано програмиране• Класове• Обекти• Структури• Полета• Методи• Конструктори• Статични членове• Презаписване на оператори
Copyright © 2013 DAVID Holding CompanyCopyright © 2013 DAVID Holding Company
Съдържание 2/2
• Видимост• Капсулиране
Copyright © 2013 DAVID Holding CompanyCopyright © 2013 DAVID Holding Company
Обектно-ориентирано програмиране• ООП е парадигма в програмирането• Програмният код се разбива на части
(обекти)• Обектите се характеризират с данни и
функции• Обектите си взаимодействат• Капсулиране, наследяване и
полиморфизъм
Copyright © 2013 DAVID Holding CompanyCopyright © 2013 DAVID Holding Company
Кратка история на ООП
• Simula 67 – първи стъпки• Smalltalk – чистият ООП език• C++, Delphi, Objective-C• Java, C#.NET, Python, Ruby
Copyright © 2013 DAVID Holding CompanyCopyright © 2013 DAVID Holding Company
Защо използваме ООП?
• Улеснява разпределянето на разработката между екип от разработчици
• Изолира промените в отделна част от програмата
• Човешкият ум разсъждава модулно
Copyright © 2013 DAVID Holding CompanyCopyright © 2013 DAVID Holding Company
Класове
• Какво е „клас“?– Категория от обекти– Описва характеристики и поведение – член-
данни и член-функции– Референтен тип данни– Може да наследи друг клас
Copyright © 2013 DAVID Holding CompanyCopyright © 2013 DAVID Holding Company
Класове
• Деклариране на класове– Ключова дума class– Наименование – съществително или фраза в
Pascal case– Базов клас и имплементирани интерфейси
(незадължително)– Блок с декларации на членове
Copyright © 2013 DAVID Holding CompanyCopyright © 2013 DAVID Holding Company
Класове
class Animal{
// Членове}
class Dog : Animal, ITrainable{
// Членове
}
Copyright © 2013 DAVID Holding CompanyCopyright © 2013 DAVID Holding Company
Обекти
• Какво е „обект“?– Променлива с тип данни клас– Нарича се още инстанция на класа– Съдържа конкретни стойности на член-
данните– Може няколко променливи да сочат към един
и същи обект в паметта
Copyright © 2013 DAVID Holding CompanyCopyright © 2013 DAVID Holding Company
Обекти
• Създаване (инстанциране) на обекти– Оператор new– Наименование на класа– Списък от аргументи
Animal beetle;beetle = new Animal();
Animal centipede = new Animal();
Copyright © 2013 DAVID Holding CompanyCopyright © 2013 DAVID Holding Company
Структури
• Какво е „структура“?– Нереферентен тип данни– Член-данни и член-функции– Задължително наследява System.ValueType– Сравнява се по стойност
Copyright © 2013 DAVID Holding CompanyCopyright © 2013 DAVID Holding Company
Структури
• Деклариране на структури– Ключова дума struct– Наименование – съществително или фраза в
Pascal case– Блок с декларации на членове
struct Book{
// Членове}
Copyright © 2013 DAVID Holding CompanyCopyright © 2013 DAVID Holding Company
Полета
• Какво е „поле“?– Член-данна– Съхранява характеристика на обекта– Променлива в рамките на обекта– Тип данни и наименование– Уникалност на наименованието
Copyright © 2013 DAVID Holding CompanyCopyright © 2013 DAVID Holding Company
Полета
• Деклариране на полета– Подобно на декларирането на променлива– Тип данни– Наименование
class Animal{
public int Age;}
Copyright © 2013 DAVID Holding CompanyCopyright © 2013 DAVID Holding Company
Полета
• Деклариране с инициализация
class Dog{
public int LegsCount = 4;}
• При липса на инициализация – стойност по подразбиране на типа данни
Copyright © 2013 DAVID Holding CompanyCopyright © 2013 DAVID Holding Company
Полета
• Полета само за четене
class Universe{
public readonly int Answer = 42;}
• Стойност се присвоява само чрез инициализация или в конструктор
Copyright © 2013 DAVID Holding CompanyCopyright © 2013 DAVID Holding Company
Полета
• Достъпване на полета на обект – с оператора .
Animal cow = new Animal();cow.Age = 5;Console.WriteLine(cow.Age);
Copyright © 2013 DAVID Holding CompanyCopyright © 2013 DAVID Holding Company
Методи
• Какво е „метод“?– Член-функция– Описва поведение– Наименование, параметри и тип на връщания
резултат– Всички функции в C# са методи– Повече от един метод с еднакви наименования
но различни параметри
Copyright © 2013 DAVID Holding CompanyCopyright © 2013 DAVID Holding Company
Методи
• Деклариране на методи– Тип на връщания резултат– Наименование– Списък от параметри– Тяло (блок от операции)
Copyright © 2013 DAVID Holding CompanyCopyright © 2013 DAVID Holding Company
Методи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?";}
}
Copyright © 2013 DAVID Holding CompanyCopyright © 2013 DAVID Holding Company
Методи
• Ключовата дума this служи за достъпване на членовете на обекта, чийто метод се изпълнява
class Animal{
public int Age;
public bool CheckIfOld(){
return (this.Age >= 10);}
}
Copyright © 2013 DAVID Holding CompanyCopyright © 2013 DAVID Holding Company
Методи
• Членовете на текущия обект могат да бъдат достъпвани и директно – с наименованията си
class Animal{
public int Age;
public bool CheckIfOld(){
return (Age >= 10);}
}
Copyright © 2013 DAVID Holding CompanyCopyright © 2013 DAVID Holding Company
Методи
• Достъпването чрез this гарантира еднозначност на наименованието
class Animal{
public int Age;
public bool CheckIfOld(){
int Age = 3;return (this.Age >= 10);
}}
Copyright © 2013 DAVID Holding CompanyCopyright © 2013 DAVID Holding Company
Конструктори
• Какво е „конструктор“?– Член, който служи за инициализация– Не се изпълнява явно, както останалите
методи– Изпълнява се след заделянето на памет с
оператора new– Има параметри– Няколко конструктора с различни параметри– Един конструктор може да изпълнява друг– Автоматично генериран конструктор без
параметри
Copyright © 2013 DAVID Holding CompanyCopyright © 2013 DAVID Holding Company
Конструктори
• Деклариране на конструктори– Наименование на класа– Списък от параметри– Тяло (блок от операции)
class Dog{
public string Name;public int LegsCount;
public Dog(string name, int legsCount){
Name = name;LegsCount = legsCount;
}}
Copyright © 2013 DAVID Holding CompanyCopyright © 2013 DAVID Holding Company
Конструктори
• Изпълняване на друг конструктор – с ключовата дума 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;
}}
Copyright © 2013 DAVID Holding CompanyCopyright © 2013 DAVID Holding Company
Конструктори
• Използване на конструктори– Операторът new– Наименование на класа или структурата– Списък от аргументи
Dog rex = new Dog("Rex");
Dog tripod = new Dog("Tripod", 3);
Copyright © 2013 DAVID Holding CompanyCopyright © 2013 DAVID Holding Company
Статични членове
• Какво е „статичен“ член?– Член, който не е обвързан с инстанция на
класа– Всеки от изброените видове членове може да
бъде статичен– Маркират се с ключовата дума static– Достъпват се чрез наименованието на класа и
оператора .
Copyright © 2013 DAVID Holding CompanyCopyright © 2013 DAVID Holding Company
Статични членове
• Статични полета– Променливи в рамките на самия клас, а не на
негов обект– Полезни за споделяне на информация между
обектите– Полезни за съхранение на данни, използвани
от статични методи– Константните полета са статични
Copyright © 2013 DAVID Holding CompanyCopyright © 2013 DAVID Holding Company
Статични членове
• Статични полета
class Animal{
public static int AnimalCount = 0;
public Animal(){
AnimalCount++;}
}
// Достъпване на статично полеConsole.WriteLine(Animal.AnimalCount);
Copyright © 2013 DAVID Holding CompanyCopyright © 2013 DAVID Holding Company
Статични членове
• Статични методи– Не се изпълняват в контекста на конкретен
обект– Не може да се прилага ключовата дума this– Не може да се борави пряко с нестатични
членове на класа– Главната функция на всяка програма е
статичен метод
Copyright © 2013 DAVID Holding CompanyCopyright © 2013 DAVID Holding Company
Статични членове
• Статични методиclass Animal{
public static int AnimalCount = 0;
public Animal(){
AnimalCount++;}
public static bool AreThereAnyAnimals(){
return (AnimalCount > 0);}
}
Copyright © 2013 DAVID Holding CompanyCopyright © 2013 DAVID Holding Company
Статични членове
• Статични конструктори– Нямат параметри– Не повече от един за всеки клас– Изпълняват се при първоначално зареждане
на класа в паметта– Служат за инициализиране на статични
полета
Copyright © 2013 DAVID Holding CompanyCopyright © 2013 DAVID Holding Company
Статични членове
• Статични конструкториclass Animal{
public static int AnimalCount;
static Animal(){
AnimalCount = 0;}
public Animal(){
AnimalCount++;}
}
Copyright © 2013 DAVID Holding CompanyCopyright © 2013 DAVID Holding Company
Презаписване на оператори
• Какво е „презаписване“ (overloading) на оператори?– Позволява на стандарните оператори да се
прилагат върху данни, декларирани от програмиста
– По подразбиране повечето оператори не могат да бъдат прилагани върху такива класове
Copyright © 2013 DAVID Holding CompanyCopyright © 2013 DAVID Holding Company
Презаписване на оператори
• Деклариране на презаписани оператори– Сходно с декларирането на статичен метод– Ключовата дума static– Тип на връщаните данни– Ключовата дума operator– Оператор, който ще бъде презаписан– Списък от параметри– Тяло (блок от операции)– Възможно е един оператор да бъде
презаписан няколко пъти с различни параметри
Copyright © 2013 DAVID Holding CompanyCopyright © 2013 DAVID Holding Company
Презаписване на оператори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);
}}
Copyright © 2013 DAVID Holding CompanyCopyright © 2013 DAVID Holding Company
Презаписване на оператори
• Презаписване на превръщания между типове– Ключовата дума static– Една от ключовите думи implicit или explicit
– Ключовата дума operator– Резултатен тип от превръщането– Параметър – начален тип на превъщането– Тяло (блок от операции)
Copyright © 2013 DAVID Holding CompanyCopyright © 2013 DAVID Holding Company
Презаписване на оператори
• Презаписване на превръщания между типове
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;}
Copyright © 2013 DAVID Holding CompanyCopyright © 2013 DAVID Holding Company
Видимост
• Какво е „видимост“?– Определя кои части на програмата имат
достъп до съответния тип данни или член– Компилаторът следи за нарушаване на тези
органичения– Полезно за предотвратяването на нежелани
действия с типа или члена– Задава се с модификатори за достъп
Copyright © 2013 DAVID Holding CompanyCopyright © 2013 DAVID Holding Company
Видимост
• Видимост на типове данни – модификаторът за достъп се поставя в началото на декларацията им– Публични – public– Вътрешни – internal
• Когато не е указан модификатор за достъп, типът данни по подразбиране е вътрешен
Copyright © 2013 DAVID Holding CompanyCopyright © 2013 DAVID Holding Company
Видимост
• Видимост на членове – модификаторът за достъп се поставя в началото на декларацията им– Публични – public– Защитени – protected– Частни – private– Вътрешни – internal– Защитени или вътрешни – protected internal
• Когато не е указан модификатор за достъп, членът по подразбиране е частен
Copyright © 2013 DAVID Holding CompanyCopyright © 2013 DAVID Holding Company
Капсулиране
• Какво е „капсулиране“?– Един от основните принципи на ООП– Предоставя се достъп единствено до
функционалността, която е проектиран да реализира класът
– Ограничава се достъпът до данните на обектите
– Ограничава се достъпът до помощните методи, които не са необходими на външния свят
Copyright © 2013 DAVID Holding CompanyCopyright © 2013 DAVID Holding Company
Капсулиране
• Ползи от капсулирането– Предотвратява нежелани намеси във
вътрешната реализация на обектите– Опростява взаимодействието на външния свят
с обекта – видими са единствено членовете, които са необходими за боравене с обекта
– Позволява промяна на вътрешната реализация на обекта, без да се налагат промени в останалите части на програмата
Copyright © 2013 DAVID Holding CompanyCopyright © 2013 DAVID Holding Company
Капсулиране
• Конвенция за капсулиране– Полетата на класовете са винаги частни– Достъпът до полетата се извършва през
конструктори, методи, свойства или индексатори с необходимата видимост
– Не се предоставят повече видими членове, отколкото са необходими за боравене с обекта
Copyright © 2013 DAVID Holding CompanyCopyright © 2013 DAVID Holding Company
Капсулиране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;}
Copyright © 2013 DAVID Holding CompanyCopyright © 2013 DAVID Holding Company
Капсулиране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);
}}
Copyright © 2013 DAVID Holding CompanyCopyright © 2013 DAVID Holding Company
Въпроси?
Copyright © 2013 DAVID Holding CompanyCopyright © 2013 DAVID Holding Company
Благодаря!
• Александър Далемски– [email protected]– [email protected]– Skype: musasho– https://www.facebook.com/adalemski
• ДАВИД академия– [email protected]– http://acad.david.bg/– @david_academy– https://www.facebook.com/groups/david.academy/