Класи і структури

Класи

Не претендуючи на повноту викладу положень об'єктно-орієнтованого аналізу і проектування, постараємося розібрати один з аспектів практичного застосування його принципів. За додатковою інформацією щодо особливостей об'єктного програмування в C# рекомендується звертатися до [3].

Мова C# повною мірою є об'єктно-орієнтованою. З представленого вище матеріалу видно, що всі дії, здійснювані в C#, є зверненнями до ресурсів якихось класів. Іноді для цього необхідно створювати об'єкти класів, іноді (при виклику статичних методів) створення об'єктів не потрібне. Однією з найважливіших особливостей C# є те, що тут не можна створити процедуру, що окремо стоїть, або функцію, вона обов'язково повинна входити в який-небудь клас.

Даний розділ ставить своєю за мету розгляд основних особливостей і базових принципів використання об'єктно-орієнтованого програмування в C#. Передбачається, що читач володіє набором необхідних знань основ об'єктно-орієнтованого програмування.

Отже, клас - це шаблон, який визначає властивості і методи об'єктів, що створюються як екземпляри даного класу. Основне призначення класу - створювати якийсь тип даних, який задає реалізацію деякої абстракції даних, характерної для завдання, на користь якого створюється програмна система. Таким чином, класи - не просто цегла, з якої будується система. Кожна цеглинка тепер має важливу змістовну начинку, що відповідає за виконання своєї операції.

Всі сучасні програмні системи створюються з використанням принципів об'єктно-орієнтованого програмування. Це означає, що будь-яка суть, з якою здійснюються які-небудь дії, повинна бути описана у вигляді класу. Таким чином, система є сукупністю класів, що взаємодіють один з одним. Визначення класу в C# практично ідентично визначенню такого ж класу в C++. Проте в C# існують додаткові елементи, що значно полегшують практичне використання класів. Розглянемо основні правила і приклади побудови і використання класів.

Припускаючи, що читач знайомий з основами об'єктного програмування на C++, розглянемо приклад створення і використання класів за допомогою мови C#.

Припустимо, для системи обробки банківських операцій, здійснюваних клієнтами, необхідно створити клас Client, який реалізує всю необхідну функціональність, пов'язану з клієнтом. Як учбовий приклад створимо клас Client, що містить інформацію про ім'я, паспорт і дату народження позичальника, властивості для доступу до цих даних, а також метод, за допомогою якого можливо редагувати інформацію про клієнта.

Визначення класу почнемо з оголошення його імені, а також завдання його полів і необхідних методів (конструкторів). Визначення класу виглядатиме таким чином:

public class Client{ private string Name; private string Passport; private DateTime BirthDate; public Client() { }}

Тут визначені поля класу, а також конструктор за умовчанням (без параметрів). Для класів C# можна визначити будь-яку кількість конструкторів. Якщо в класі не визначений жоден конструктор, використовується конструктор за умовчанням, який при створенні об'єкту автоматично привласнить всім змінним - членам класу безпечні значення. В даному випадку, конструктор за умовчанням задається явно.

Область видимості полів класу відповідно до правил повинна бути визначена або як закрита, або як захищена (у випадку, якщо передбачається спадкоємство його полів). Доступ же до полів - членам класу повинен бути організований або за допомогою методів, або за допомогою властивостей класу. Раніше в мові C++ властивості відсутні, проте вони дозволяють організовувати дуже простій доступ до полів - членів класу. Створимо властивості класу Client, забезпечуюче читання і запис значень полів класу.

public string passport{ get { return Passport; } set { Passport = value; }} public string name{ get { return Name; } set { Name = value; }} public int age{ get { int а; а = DateTime.Now.Year - BirthDate.Year; return а; }} public DateTime birthdate{ get { return BirthDate; } set { if (DateTime.Now > value) BirthDate = value; else throw new Exception("Введена невірна дата народження"); }}

Як видно з даного прикладу, властивість складається з методів set і get. При цьому властивість повинна містити хоч би один з методів. Set дозволяє змінювати значення поля класу, get - набувати значення. У метод Set передається значення параметра за допомогою змінній value. Обидва методи можуть містити довільну кількість операторів, що описують алгоритм виконання дій в процесі читання або запису значення в полі класу. У даному прикладі властивості passport і name дозволяють просто дістати доступ до полів класу, прочитуючи або встановлюючи значення відповідних змінних. Властивість birthdate також призначена для читання і запису значення змінної - члена класу BirthDate. При цьому при читанні значення (операція get) відбувається просто передача значення змінній BirthDate, при спробі ж запису нового значення в цю змінну відбувається перевірка допустимості встановлюваного значення змінної. В даному випадку перевірка зводиться до порівняння нового значення дати народження з поточною датою. Якщо встановлюване значення дати народження більше або рівно поточній даті, генерується виключення, яке не дозволяє записати нове значення змінну, - член класу.

Властивість age застосовується для отримання поточного віку клієнта. Воно призначене тільки для читання значення із змінній, тому містить лише метод get. При використанні властивості age відбувається обчислення поточного значення віку клієнта в літах шляхом віднімання року народження з поточного значення року.

Використання властивостей аналогічно використанню змінних. У наступному прикладі створюється об'єкт с1 класу Client. Потім поля даного об'єкту заповнюються значеннями з використанням властивостей. Після цього на екран виводяться значення полів, для цього також застосовуються властивості класу:

Client c1=new Client();c1.name = "Вася";c1.passport = "9002";c1.birthdate = new DateTime(1967, 08, 03);Response.Write("Імя=" + c1.name+"</br>");Response.Write("Паспорт=" + c1.passport+"</br>");Response.Write("Возраст="+c1.age);

Крім змінних - членів класу і властивостей для доступу до цих змінних практично будь-який клас містить методи, призначені для опису алгоритмів виконання класом дій. Один з обов'язкових методів класу - конструктор за умовчанням - вже був показаний раніше. Проте класи в C# можуть містити довільну кількість конструкторів, призначених для ініціалізації об'єкту даного класу. Як приклад створимо конструктор з параметрами, що дозволяє ініціалізувати об'єкт класу, вводячи значення полів цього об'єкту як параметри конструктора. Зробити це можна таким чином:

public Client(string ClientName, string ClientPassportDateTime ClientBirthDate){ name = ClientName; passport = ClientPassport; birthdate = ClientBirthDate;}

Видно, що конструктор містить три параметри, пояснювати сенс яких не потрібно. У тілі конструктора відбувається запис переданих як параметри значень у відповідні поля класу за допомогою властивостей даного класу. У випадку з датою народження це дозволяє не дублювати процедуру перевірки введеної дати, а скористатися алгоритмом, реалізованим у властивості birthdate.

Створимо також метод, що дозволяє змінити значення полів об'єкту класу Client:

public void EditClient(string ClientName, string ClientPassport,DateTime ClientBirthDate){ Name = ClientName; Passport = ClientPassport; birthdate = ClientBirthDate;}

Як видно з прикладу, початковий код цього методу практично повністю ідентичний конструктору з параметрами з різницею в імені, а також в типі повертаного значення. Звичайно, в даному випадку можна було б обійтися і використанням властивостей для зміни значень полів класу, проте, іноді буває корисно, щоб такого роду зміни були реалізовані в рамках одного методу, тим більше, якщо алгоритм змін є нестандартним.

Тепер, з використанням конструктора з параметрами, можна створити і відразу ж ініціалізувати об'єкт класу Client:

Client c1=new Client("Вася","9002",new DateTime(1967,08,03));

Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: