Клас ООП. Інкапсуляція. Методи get та set.

Про матеріал
В даному матеріалі розкривається зміст та принцип роботи методів get та set в С++, ілюстрація принципу інкапсуляції ООП шляхом встановлення взаємозвʼязку та аналогії між програмними та реальними обʼєктами.
Перегляд файлу

Первомайський ЦНТТУМ

Гурток «Сучасні технології програмування»

Керівник гуртка Семенова Олена Анатоліївна

Розробка заняття на тему:

Тема: «Клас ООП. Модифікатори доступу класу. Інкапсуляція. Методи get та set

Мета:  повторити зміст понять: клас, об“єкт класу, поля та методи класу, «модифікатори доступу», зрозуміти зміст та різницю роботи методів get та set стосовно змісту поняття «інкапсуляція», виховувати вміння встановлювати взаємозвʼязок та аналогію між програмними та реальними обʼєктами, розвивати увагу, спостережливість та логічне мислення.

Обладнання: ПК, ПЗ середовище програмування DevC++.

Хід заняття

1. Організаційний момент та розминка.

1. Розімнемо трошки наші сірі головні звивинки :) : складаємо 12 слів, що вміщують не менше 5 символів із літерами : «ф, і, в, а, п, р, о, л, д, ж, к, е, н, г, т, ь, и, м, ш, у».

2. Записуємо 3 рядка цих слів за допомогою сліпого десятипальцевого методу набору через кому.

3. Перевіряємо правильність набору та ставимо усні оцінки своїй роботі. Пам“ятаємо, що ми чесні :).

2.  Основна частина. Повторення та перехід до засвоєння нових понять.

 Сьогодні ми продовжимо вивчати класи та їх методи. Але для початку давайте відповімо на декілька запитань, щоб відсвіжити в пам“яті минулі заняття:

1. Що таке клас в ООП?

2. Що являється об“єктом класу?

3. Що таке поле класу?

4. Що таке модифікатори доступу?

5. Яка різниця між модифікатором private: та protected: ?

6. Поясніть, як ви розумієте поняття методу класу?

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

 Через ці три «р» реалізується принцип інкапсуляції в ООП. (Пам“ятаєте, що це таке?).

 

 

 

 

 

 

 

 

 Методи get та set, які ми сьогодні з вами розгянемо, достатньо виразно ілюструють цей принцип.

 Як ви розумієте, поняття геттери та сеттери, звичайно, як і усі терміни в програмуванні, походять від англійських слів:  getter («отримувач»)— від англійського «get» - «отримувати», setter («встановлювач») - від англійського «set» - «встановлювати».

 Тобто це є способом вводити («set») та отримувати  («get») дані і зауважу, що цей спосіб загальноприйнятий, тому що зазвичай в програмуванні при створенні класів робити поля та методи класу загальнодоступними не прийнято. Це порушує принцип інкапсуляції.

  Давайте розглянемо все за допомогою нашого улюбленого класу котів :) .

 

 

 

 

 

 

 Повернемось до нашої програми, де ми створили клас котів... :)

class  Cats //Об“являємо та описуємо клас котів

{public:

string name;

int age;

void Print ()

{ cout<<“cat1 name is -  \t“<<name<<“\tcat1 age is - \t“<<age<<endl;

}

};

 іnt main ()

{

Cats cat1;

cat1.name =“Simone“;

cat1.age = 2;

cat1.Print();

return 0;

} 

 Скажу вам, що ось такий доступ до полів та методів класу, відкритий та вільний, як у цій програмі, в ООП взагалі за принципом інкапсуляції заборонений. І правильно написаний клас є таким: щоб отримати доступ до якихось даних, треба щоб у поля, з яким потрібно взаємодіяти, були геттер та сеттер, або тільки геттер або тільки сеттер, в залежності від потреби… тобто...

 Геттери та сеттери — це звичайні методи класу, які направлені на те, щоб взаємодіяти із якимись полями класу.

 Пам“ятаємо, що в ООП прийнято при створенні класу робити так, щоб змінні (тобто поля класу) були відокремлені від функції (тобто методів класу) і що стандартно прийнято приватними (закритими) робити властивості класу, а публічними (відкритими) — функції, тобто, методи класу, за виключенням якихось конкретних потреб.

 Отже, геттери та сеттери повинні бути public: методами, для кожного поля (властивості) нашого класу ми маємо встановити ці методи, щоб можно було з ними взаємодіяти.

 Ви спитаєте: навіщо тоді взагалі ці геттери та сеттери, якщо ми все одно все самі задаємо всередині класу? Та пригадайте принцип інкапсуляції… Ви повинні захистити дані та зміст вашої програми, коли нею користується хтось інший, надавши користувачу лише зручний інтерфейс для цього. Наприклад, ви користуєтесь пультом дистанційного керування телевізором, але вам недоступна програма, за якою працює цей пульт, тому що ви можете порушити його роботу.

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

 Давайте розглянемо це на прикладі нашої програми і організуємо методи гет та сет для кожного поля нашого класу. Для початку робимо обмеження доступу до полів класу. Яким чином? Так, змінюємо модифікатор на private:.

class  Cats //Об“являємо та описуємо клас котів

{private:

string name;

int age;

 

public:

void Print ()

{ cout<<“cat1 name is -  \t“<<name<<“\tcat1 age is - \t“<<age<<endl;}

};

 іnt main ()

{

Cats cat1;

cat1.name =“Simone“;

cat1.age = 2;

cat1.Print();

return 0;

} 

 Що ми отримаємо, коли запустимо нашу програму? Правильно, цілу купу помилок :) … Чому? Що саме не подобається компілятору?  Те, що ми спробували надати значення змінним, які є приватними, тобто недоступними. Таким чином, напряму ми не можемо надавати їм значення, прямий доступ до полів класу закрито.

 Але ми можемо створити методи, за допомогою яких користувач зможе отримати дані об“єкта нашого класу. Яким чином? Згадаймо, що таке метод? Так, це, функція, яка описує роботу об“єктів класу. Тепер настав час згадувати, що таке функція і як вона працює. :) Звичайно, у визначених функцій свої особливості. В даному випадку, маємо метод get, який записується таким чином:

string GetName () //  Чому string? Тип змінної name текстовий

{return name;}

 За аналогією опишіть геттер для віку котів :).

int GetAge () // int, тому що Тип змінної age цілочисленний

{return age;}

  Окремо хочу звернути вашу увагу на написання методу:  GetName. Запам“ятайте це: назва методу та поля, яке він описує -  з великої літери.

 Тепер наш клас і програма виглядають так:
class  Cats //Об“являємо та описуємо клас котів

{private:

string name;

int age;

 

public:

string GetName ()

{return name;}

int GetAge () 

{return age;}

 

void Print ()

{ cout<<“cat1 name is -  \t“<<name<<“\tcat1 age is - \t“<<age<<endl;

}

};

 іnt main ()

{

Cats cat1;

cat1.name =“Simone“;

cat1.age = 2;

cat1.Print();

return 0;

} 

 Як гадаєте, тепер програма відпрацює коректно? Чому? Тому що ми знову в тілі програми спробували працювати з полями класу напряму, але доступ до них заборонений.

 Тепер якщо ми закоментуємо, або взагалі видалимо рядки, де є присвоювання значень полям класу в тілі програми, то…?

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

 Але нам потрібно працювати з цими полями…Як це зробити? Пригадаємо, що геттери і сеттери— це методи, тобто функції. І тому користуватись ними потрібно, так як з ми працюємо з функцією. Але з однією відмінністю: ця функція є методом класу, тому звертатись до неї ми будемо як до властивості класу. Яким чином ми надавали значення полям класу? cat1.name =“Simone“;… Так?

 Коли ви записуєте об“єкт класу cat1 та ставите крапку, компілятор вам показує, які поля та методи класу вам доступні. Подивіться, зараз вам доступні не лише поля, а й геттери. А для того, щоб надавати значення полям, нам потрібний метод, який дасть можливість це зробити — сеттер і його також треба описати в нашому класі.

 Давайте це зробимо. Аналогічно з методом Get, але зі своїми особливостями :).

class  Cats //Об“являємо та описуємо клас котів

{private:

string name;

int age;

 

public:

string GetName ()

{return name;}

int GetAge () 

{return age;}

 

void SetName (string sName)

{name=sName;}

void SetAge (string sAge)

{name=sAge;}

void Print ()

{ cout<<“cat1 name is -  \t“<<name<<“\tcat1 age is - \t“<<age<<endl;}

};

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

 Пам“ятаєте ім“я та вік нашого першого кота? :) Надайте ці значення відповідно в програмі.

 

class  Cats //Об“являємо та описуємо клас котів

{private:

string name;

int age;

 

public:

string GetName ()

{return name;}

int GetAge () 

{return age;}

 

void SetName (string sName)

{name=sName;}

void SetAge (string sAge)

{name=sAge;}

void Print ()

{ cout<<“cat1 name is -  \t“<<name<<“\tcat1 age is - \t“<<age<<endl;}

};

 

іnt main ()

{

Cats cat1;

cat1.SetName =“Simone“;

cat1.SetAge = 2;

cat1.Print();

return 0;

} 

 Тепер компілятору все подобається і програма відпрацювала коректно :).

 Спробуйте тепер самостійно дописати цю програму так, щоб користувач вводив ім“я та вік для кота в консолі, а результатом був виведення введеного користувачем імені, але значення віку на один рік більше :).

 

Завершення буде ваше домашнім завданням. 

 Творчої вам наснаги! :)

docx
Додано
25 травня 2020
Переглядів
746
Оцінка розробки
Відгуки відсутні
Безкоштовний сертифікат
про публікацію авторської розробки
Щоб отримати, додайте розробку

Додати розробку