691 likes | 1.04k Views
Курс по програмиране на C#. Занятие № 6 Обектно-ориентирано програмиране. Класове и обекти. Членове. Видимост и капсулиране. Съдържание 1/2. Обектно-ориентирано програмиране Класове Обекти Структури Полета Методи Конструктори Статични членове Презаписване на оператори.
E N D
Курс по програмиране на C# Занятие №6Обектно-ориентирано програмиране. Класове и обекти. Членове. Видимост и капсулиране
Съдържание 1/2 • Обектно-ориентирано програмиране • Класове • Обекти • Структури • Полета • Методи • Конструктори • Статични членове • Презаписване на оператори
Съдържание 2/2 • Видимост • Капсулиране
Обектно-ориентирано програмиране • ООП е парадигма в програмирането • Програмният код се разбива на части (обекти) • Обектите се характеризират с данни и функции • Обектите си взаимодействат • Капсулиране, наследяване и полиморфизъм
Кратка история на ООП • Simula 67 – първи стъпки • Smalltalk – чистият ООП език • C++, Delphi, Objective-C • Java, C#.NET, Python, Ruby
Защо използваме ООП? • Улеснява разпределянето на разработката между екип от разработчици • Изолира промените в отделна част от програмата • Човешкият ум разсъждава модулно
Класове • Какво е „клас“? • Категория от обекти • Описва характеристики и поведение – член-данни и член-функции • Референтен тип данни • Може да наследи друг клас
Класове • Деклариране на класове • Ключова дума class • Наименование – съществително или фраза в Pascal case • Базов клас и имплементирани интерфейси (незадължително) • Блок с декларации на членове
Класове classAnimal{// Членове} classDog : Animal, ITrainable{// Членове}
Обекти • Какво е „обект“? • Променлива с тип данни клас • Нарича се още инстанция на класа • Съдържа конкретни стойности на член-данните • Може няколко променливи да сочат към един и същи обект в паметта
Обекти • Създаване (инстанциране) на обекти • Оператор new • Наименование на класа • Списък от аргументи Animalbeetle;beetle = newAnimal(); Animal centipede = newAnimal();
Структури • Какво е „структура“? • Нереферентен тип данни • Член-данни и член-функции • Задължително наследява System.ValueType • Сравнява се по стойност
Структури • Деклариране на структури • Ключова дума struct • Наименование – съществително или фраза в Pascal case • Блок с декларации на членове structBook{// Членове}
Полета • Какво е „поле“? • Член-данна • Съхранява характеристика на обекта • Променлива в рамките на обекта • Тип данни и наименование • Уникалност на наименованието
Полета • Деклариране на полета • Подобно на декларирането на променлива • Тип данни • Наименование classAnimal{publicint Age;}
Полета • Деклариране с инициализация classDog{publicint LegsCount = 4;} • При липса на инициализация – стойност по подразбиране на типа данни
Полета • Полета само за четене classUniverse{publicreadonlyint Answer = 42;} • Стойност се присвоява само чрез инициализация или в конструктор
Полета • Достъпване на полета на обект – с оператора . Animal cow = newAnimal();cow.Age = 5;Console.WriteLine(cow.Age);
Методи • Какво е „метод“? • Член-функция • Описва поведение • Наименование, параметри и тип на връщания резултат • Всички функции в C# са методи • Повече от един метод с еднакви наименования но различни параметри
Методи • Деклариране на методи • Тип на връщания резултат • Наименование • Списък от параметри • Тяло (блок от операции)
Методи class Dog{publicvoid Bark() {Console.WriteLine("Woof woof!"); }publicvoid Bite(string someone) {Console.WriteLine("I bit {0} and I liked it.", someone); }publicstring AskForDirections() {return"Woof?"; }}
Методи • Ключовата дума thisслужи за достъпване на членовете на обекта, чийто метод се изпълнява classAnimal{publicint Age;publicbool CheckIfOld() {return (this.Age >= 10); }}
Методи • Членовете на текущия обект могат да бъдат достъпвани и директно – с наименованията си classAnimal{publicint Age;publicbool CheckIfOld() {return (Age >= 10); }}
Методи • Достъпването чрез this гарантира еднозначност на наименованието classAnimal{publicint Age;publicbool CheckIfOld() {int Age = 3;return (this.Age >= 10); }}
Конструктори • Какво е „конструктор“? • Член, който служи за инициализация • Не се изпълнява явно, както останалите методи • Изпълнява се след заделянето на памет с оператора new • Има параметри • Няколко конструктора с различни параметри • Един конструктор може да изпълнява друг • Автоматично генериран конструктор без параметри
Конструктори • Деклариране на конструктори • Наимнование на класа • Списък от параметри • Тяло (блок от операции) classDog{publicstring Name;publicint LegsCount;public Dog(string name, int legsCount) { Name = name; LegsCount = legsCount; }}
Конструктори • Изпълняване на друг конструктор – с ключовата дума this и списък от аргументи преди тялото classDog{publicstring Name;publicint LegsCount;public Dog(string name) : this(name, 4) { }public Dog(string name, int legsCount) { Name = name; LegsCount = legsCount; }}
Конструктори • Използване на конструктори • Операторът new • Наимнование на класа или структурата • Списък от аргументи Dog rex = newDog("Rex"); Dog tripod = newDog("Tripod", 3);
Статични членове • Какво е „статичен“ член? • Член, който не е обвързан с инстанция на класа • Всеки от изброените видове членове може да бъде статичен • Маркират се с ключовата дума static • Достъпват се чрез наименованието на класа и оператора .
Статични членове • Статични полета • Променливи в рамките на самия клас, а не на негов обект • Полезни за споделяне на информация между обектите • Полезни за съхранение на данни, използвани от статични методи • Константните полета са статични
Статични членове • Статични полета classAnimal{publicstaticint AnimalCount = 0;public Animal() { AnimalCount++; }} // Достъпване на статично полеConsole.WriteLine(Animal.AnimalCount);
Статични членове • Статични методи • Не се изпълняват в контекста на конкретен обект • Не може да се прилага ключовата дума this • Не може да се борави пряко с нестатични членове на класа • Главната функция на всяка програма е статичен метод
Статични членове • Статични методи classAnimal{publicstaticint AnimalCount = 0;public Animal() { AnimalCount++; }publicstaticbool AreThereAnyAnimals() {return (AnimalCount > 0); }}
Статични членове • Статични конструктори • Нямат параметри • Не повече от един за всеки клас • Изпълняват се при първоначално зареждане на класа в паметта • Служат за инициализиране на статични полета
Статични членове • Статични конструктори classAnimal{publicstaticint AnimalCount;static Animal() { AnimalCount = 0; }public Animal() { AnimalCount++; }}
Презаписване на оператори • Какво е „презаписване“ (overloading) на оператори? • Позволява на стандарните оператори да се прилагат върху данни, декларирани от програмиста • По подразбиране повечето оператори не могат да бъдат прилагани върху такива класове
Презаписване на оператори • Деклариране на презаписани оператори • Сходно с декларирането на статичен метод • Ключовата дума static • Тип на връщаните данни • Ключовата дума operator • Оператор, който ще бъде презаписан • Списък от параметри • Тяло (блок от операции) • Възможно е един оператор да бъде презаписан няколко пъти с различни параметри
Презаписване на оператори classRational{publicintNumerator;publicint Denominator;public Rational(intnumerator, int denominator) {Numerator = numerator; Denominator = denominator; }publicstaticRationaloperator +(Rational number1, int number2) {returnnewRational(number1.Numerator * number2, number1.Denominator); }publicstaticRationaloperator +(Rational number1, Rational number2) {intsumNumerator = number1.Numerator * number2.Denominator+ number2.Numerator * number1.Denominator;int sumDenominator = number1.Denominator * number2.Denominator;returnnewRational(sumNumerator, sumDenominator); }}
Презаписване на оператори • Презаписване на превръщания между типове • Ключовата дума static • Една от ключовите думи implicit или explicit • Ключовата дума operator • Резултатен тип от превръщането • Параметър – начален тип на превъщането • Тяло (блок от операции)
Презаписване на оператори • Презаписване на превръщания между типове publicstaticimplicitoperatordouble(Rational number){return (double)number.Numerator / (double)number.Denominator;} publicstaticexplicitoperatorint(Rational number){returnnumber.Numerator / number.Denominator;}
Видимост • Какво е „видимост“? • Определя кои части на програмата имат достъп до съответния тип данни или член • Компилаторът следи за нарушаване на тези органичения • Полезно за предотвратяването на нежелани действия с типа или члена • Задава се с модификатори за достъп
Видимост • Видимост на типове данни – модификаторът за достъп се поставя в началото на декларацията им • Публични – public • Вътрешни – internal • Когато не е указан модификатор за достъп, типът данни по подразбиране е вътрешен
Видимост • Видимост на членове – модификаторът за достъп се поставя в началото на декларацията им • Публични – public • Защитени – protected • Частни – private • Вътрешни – internal • Защитени или вътрешни – protected internal • Когато не е указан модификатор за достъп, членът по подразбиране е частен
Капсулиране • Какво е „капсулиране“? • Един от основните принципи на ООП • Предоставя се достъп единствено до функционалността, която е проектиран да реализира класът • Ограничава се достъпът до данните на обектите • Ограничава се достъпът до помощните методи, които не са необходими на външния свят
Капсулиране • Ползи от капсулирането • Предотвратява нежелани намеси във вътрешната реализация на обектите • Опростява взаимодействието на външния свят с обекта – видими са единствено членовете, които са необходими за боравене с обекта • Позволява промяна на вътрешната реализация на обекта, без да се налагат промени в останалите части на програмата
Капсулиране • Конвенция за капсулиране • Полетата на класовете са винаги частни • Достъпът до полетата се извършва през конструктори, методи, свойства или индексатори с необходимата видимост • Не се предоставят повече видими членове, отколкото са необходими за боравене с обекта
Капсулиране publicclassDog{privatereadonlystring _name;privatereadonlyint _age;privatereadonlyint _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; }publicstring GetName() {return _name; }
Капсулиране publicint GetAge() {return _age; }publicint GetLegsCount() {return _legsCount; }publicvoid Bark() {Console.WriteLine("{0} barks: Woof woof!", _name); }publicvoid Lick(string someone) {Console.WriteLine("{0} licks {1}'s face. Yuck!", _name, someone); }}
Благодаря! • Александър Далемски • sasho@david.bg • musashi.bg@gmail.com • Skype: musasho • https://www.facebook.com/adalemski • ДАВИД академия • acad@david.bg • http://acad.david.bg/ • @david_academy • https://www.facebook.com/groups/david.academy/