Модул 3. Увод в обектно-ориентирано програмиране

Материалиarrow-up-right | Задачиarrow-up-right | Решенияarrow-up-right

Съдържание

1. Дефиниране на класове

Абстрактни типове данни

  • Абстрактните типове данни описват: множество от данни и възможните операции в рамките на този тип.

  • Абстрактните типове данни ни позволяват да опишем конкретна структура, без обаче да се интересуваме от детайлите в тази реализация.

Дефиниране на прост клас

  • Класовете служат за създаване на имплементация на aбстрактни типове данни

  • Класовете ни дават начин да опишем и създадем обекти

Именуване на класове

  • Класовете са PascalCase

  • Използвайте описателни съществителни

  • Избягвайте абревиатури

Членове на класа

  • Класа съдържа състояния и действия

  • Полетата съдържат състоянието

  • Методите описват действието

Създаване на обект

Класът може да има много инстанции (обекти)

Обектна референция

Декларирането на променлива създава референция

Класове и Обекти

Класовете ни позволяват да описваме и създаваме обекти. Обектът е една инстанция на класа.

Задача: Дефинирайте клас Person

Дефинирайте клас Person, като за него пазете информация за името и възрастта на човек и реализирайте единствено действието IntroduceYourself(), което отпечатва представяне на човека. След това създайте и използвайте обект от класа Person.

Сега е време да използваме класа и да направим обект в Main метода ни в Program.cs:

За момента няма да акцентираме на теоретичния смисъл на кода от по-рано – той ще се уточни допълнително в следващите теми.

Задача: Човекът и неговите пари

Дефинирайте клас Person, като за него пазете информация за името и възрастта на човек, както и информация за банкови сметки (клас BankAccount). Направете метод GetBalance(), който дава информация каква е общата стойност на парите, които притежава човек.

  • Първо ще създадем файл за клас BankAccount.

  • След това ще направим възможно в Person да се пази списък от банковите сметки на човека

  • Последно в класа Person ще добавим метод, който изчислява сумата от балансите на всички смекти в списъка

В Person.cs добавете поле, в което ще се пази списък от банковите сметки, както и свойство:

В Person.cs добавете метода, който ще изчислява стойността на сумата от балансите на всички сметки:

  • Създайте три обекта от клас Person в Main().

  • Създайте един обект от клас BankAccount, задайте му ID и баланс и го добавете към първия човек, използвайки метода Add() - не забравяйте, че .Accounts е списък и има метод Add()

  • Аналогично за втория човек създайте две сметки и му ги добавете, а за третия – три;

  • Изкарайте трите суми – състоянието на първия, втория и третия човек

2. Полета и методи

Елементи на класа

  • Клас се дефинира чрез състояние и поведение

  • Полетата съхраняват състоянието

  • Методите описват поведението

Полета

Полетата на класа имат тип и име

Модификатори

  • Класовете и елементите на класа имат модификатори

  • Модификаторите определят видимостта

Свойства

Използва се за създаване на методи за четене (getters) и методи за промяна (setters).

Задача: Описване на клас Банкова сметка

Създайте клас BankAccount със следното съдържание:

Методи

Те са изпълним код (алгоритъм), който променя състоянието:

Задача: Getter-и и Setter-и

Създайте клас BankAccount със следното съдържание:

Конструктори

Специален вид методи, извиквани при създаване на обекта

Може да имате множество конструктори за даден клас

Начално състояние на обекта

Конструкторите задават началното състояние на обекта

Верижно извикване на конструктори

Конструкторите могат да се извикват един друг

Задача: Дефиниране на клас физическо лице

Създайте клас Person със следното съдържание

3. Енкапсулация на данни

Капсулация

Процесът на обединяване на кода и данните в едно цяло (обект).

Полетата на обекта трябва да са private

Използване на getters и setters за достъп до данните

Задача: Клас Creature

  • Създайте клас Creature

  • Creature трябва да има полета name, years, areal, съответно за име, възраст и местообитание

  • Създайте методи за достъп до обектите getters и setters за полетата

Ключова дума this

  • this е препратка към текущия обект

  • this може да сочи към променлива, която е инстанция (представител) на текущия клас

  • this може да се предава като аргумент в метод или като извикване на конструктор

  • this може да се върне като стойност на метод

  • this може да извика метод на текущия клас

  • this може да извиква конструктор на текущия клас

Private Модификатор за достъп

Основен начин за капсулиране на обект и скриване на данни от външния свят

  • Класовете и интерфейсите не могат да са private. Идеята за интерфейс е да се даде възможност за връзка с "външния свят" – т.е. – трябва да са достъпни

  • Могат да бъдат достъпни само в декларацията на класа

Protected Модификатор за достъп

  • Могат да бъдат достъпни само от подкласове

  • Модификаторът за достъп protected не може да бъде приложен за класове и интерфейси

  • Предотвратява външни класове да се опитват да го използват

Internal модификатор за достъп

internal е модификатор по подразбиране в C#.

Дава достъп на всеки друг клас в същия проект

Public модификатор за достъп

Клас, метод, конструктор, деклариран в public клас може да бъде достъпен от всеки клас, принадлежащ на .NET

  • Употребата се налага ако се опитваме да достъпим public клас в друг namespace

  • Методът Main() в приложението трябва да е public

  • Интерфейсите са public. Тъй като смисълът им е да дават връзка с външния свят

Задача: Подредете Persons по Name и Age

Create a class Person

Задача: Увеличение на заплатата

  • Добавете към класа Person поле salary

  • Добавете getter за заплата

  • Добавете метод, който променя заплатата с даден процент

  • Persons, по-млади от 30 вземат половината от увеличението

Валидация

Валидацията на данни се случва в setters

Сътрудник на вашия клас трябва да се грижи за обработка на изключенията. Конструкторите използват private setter с валидационна логика.

Гарантират валидно състояние на обекта при неговото създаване.

Задача: Валидация на данни

  • Разширете Person с валиация за всяко поле

  • Names трябва да са с не по-малко от 3 символа

  • Age не може да е нула или отрицателно

  • Salary да не е по-малко от 460

Непроменими (Immutable) обекти

Когато имате препратка reference към инстанция на обект, съдържанието, на която не може да бъде променяно.

Променими полета

Променимите private полета все още не са капсулирани

Тогава getter-а е също и setter

Задача: Първи и Резервен отбор

  • Разширете вашия проект с клас Team

  • Team трябва да има два комплекта отбори първи отбор и втори отбор

  • Въведете persons от клавиатурата и ги добавете към отбора

  • Ако те са по-млади от 40, тогава ги добавете към първи отбор

  • Изведете броя на играчите на всеки отбор

4. Статични полета и методи

Статични полета

Статичните полета в класа:

  • Принадлежат на самия клас

  • Имат една и съща стойност за всеки обект

  • Могат да бъдат достъпени и само чрез класа - без създаване на обект от този клас

Подобно на полетата останалите членове на класа също могат да бъдат статични.

Статични свойства

Статичните свойства в класа:

  • Принадлежат на самия клас

  • Могат да бъдат достъпени и само чрез класа - без създаване на обект от този клас

Използването на свойства е удобно, когато имаме статични полета, но не искаме да позволим тяхната промяна в друг клас, който използва нашия. Ако трябва да използваме само поле, то за да го достъпим извън класа, трябва да е public, което пък би позволило неговото изменение. Именно тук идват статичните свойства.

Задача: Преброй хората

Напишете програма, която да поддържа информация колко обекта от клас Person има създадени до момента. Реализирайте я използвайки статично поле и свойство.

Ще създадем статично поле, което ще поддържа информацията. След това ще направим статично свойство, което ще има само get, понеже в противен случай ще можем да манипулираме брояча, когато използваме класа, а в случая идеята е ползвателя на класа да не може да промени полето, в което е записан броя, а само да го достъпи.

Броячът ще се увеличава в рамките на конструктора на класа.

Статични методи

Статичните методи в класа:

  • Принадлежат на самия клас

  • Могат да бъдат достъпени само чрез класа - без създаване на обект от този клас

  • Удобни са за извършване на действия върху всички обекти от класа или за извършване на действия, които нямат пряко отношение към обектите

Задача: Аритметични действия

Създайте клас, който поддържа статични методи за аритметични действия върху две цели числа:

  • Add(int, int) – събира числата

  • Multiply(int, int) – умножава числата.

Използвайте методите от този клас в Main метода да извършите засичане на команда и извършете операцията.

Извиквайте методите по аналогичен начин в Main(): Arithmetics.Add(10, 15);

Статични класове

В решението оставихме класа си нестатичен. Това означава, че от него може да се направи обект. В случая това обаче би било безсмислено. За да не се допуска създаване на обект от даден клас, който има само статични членове ние можем да поставим думата static пред class: static class.

Когато отбележим един клас като статичен това означава, че неговите членове също ще са статични и от този клас няма да може да се създават обекти, а ще може членовете му да се ползват само статично. Много класове от .NET са статични (например Math)

Статични конструктори

Конструкторите в един клас също могат да бъдат статични.

Ако един конструктор е статичен той се изпълнява, когато едно от тези събития се случи за първи път:

  • Създаде се обект от класа (ако той е нестатичен)

  • Достъпва се статичен член от класа

Най-често статични конструктори се използват за инициализация на статични полета.

Задача: Заявка за корен

Напишете клас, който съдържа метод, който връща корен квадратен при подадена заявка. Възможно е да получите голям брой заявки, така че трябва да отговаряте бързо на всяка една от тях.

Last updated