Первомайський ЦНТТУМ
Гурток «Сучасні технології програмування»
Керівник гуртка Семенова Олена Анатоліївна
Розробка заняття на тему:
Тема: «Класи ООП. Реалізація принципу інкапсуляції через private методи.»
Обладнання: ПК, ПЗ середовище програмування DevC++.
Хід заняття
1. Організаційний момент та розминка.
1. Розімнемо трошки наші сірі головні звивинки :) : складаємо 10 слів, що вміщують не менше 7 символів із літерами : «ф, і, в, а, п, р, о, л, д, ж, к, е, н, г, т, ь, и, м, ш, у, с, б».
2. Записуємо 3 рядка цих слів за допомогою сліпого десятипальцевого методу набору через кому.
3. Перевіряємо правильність набору та ставимо усні оцінки своїй роботі. Пам“ятаємо, що ми чесні :).
2. Основна частина. Повторення та перехід до розгляду задач та прикладів за темою.
Сьогодні ми продовжимо вивчати класи та їх методи та розглянемо реалізацію основного принципу ООП в класах. Але для початку, як завжди, давайте відповімо на декілька запитань:
1. Яка різниця між полем та методом класу?
2. Що таке модифікатори доступу?
3. Що таке геттер?
4. Які модифікатори застосовуються до геттерів та сеттерів?
Отже, полем класу є властивості змінної, яка описана в класі, а методом є функція, яка описує дії об“єкта класу, доступ до даних реалізується за допомогою модифікаторів, так звані, «три «р»», через які реалізується принцип інкапсуляції в ООП. (Пам“ятаєте, що це таке?).
Методи get та set, які ми з вами розглядали на минулому занятті, достатньо виразно ілюструють цей принцип. Та неменш виразно показує реалізацію інкапсуляції модифікатор доступу private. І сьогодні ми на прикладах це побачимо детальніше.
Для початку розглянемо нашу незавершену програму, яка стала вашим домашнім завданням. :) Сподіваюсь, всі з ним справились.
Завданням було самостійно доповнити програму так, щоб користувач вводив ім“я та вік для кота в консолі, а результатом стало виведення введеного користувачем імені кота, але значення віку виводилось збільшеним на одиницю.
Які кроки треба було додати в програму? І в яку частину?
Так, зміни в класі нам не потрібні, тільки в тілі програми.
Отже, в нас є отака програма:
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 ()
{
int a;
string A;
Cats cat1;
cout<< “Як звуть Вашого кота?“<<endl;
cin>>A;
cout<<“Скільки йому років?“<<endl;
cin>>a;
cat1.SetName (A);
cat1.SetAge(a+1);// Яким ще чином можна було реалізувати цю операцію?
(окремим оператором, або через інкремент, або через метод класу: cat1.Print(a+1) чи cat1.Print(a++); чому останній запис не вірний?)
cat1.Print();
return 0;
}
Ми ж пам“ятаємо, що методів у класу може бути декілька: в залежності від поведінки та можливостей об“єктів класу (пригадайте клас кавомолок, про який шла мова при першому знайомстві з класами в ООП).
Тепер давайте подумаємо, який функціонал може бути у нашого класу? :)
Так, об“єкти цього класу можуть піти на прогулянку :).
Давайте додамо нашому класу такий паблік-метод :).
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;}
void GoWalk() // Кіт іде на прогулянку
{cout <<“Cat “<<name<<“ goes for a walk“<<endl;}
};
Тепер ми можемо використати цей метод. Якою командою? Так, cat1.GoWalk();
іnt main ()
{
int a;
string A;
Cats cat1;
cout<< “Як звуть Вашого кота?“<<endl;
cin>>A;
cout<<“Скільки йому років?“<<endl;
cin>>a;
cat1.SetName (A);
cat1.SetAge(a+1);/
cat1.Print();
cat1.GoWalk();
return 0;
}
Що ми отримаємо? Напис, що наш об“єкт пішов на прогулянку. Але наш кіт дуже розумний і перевіряє, чи двері зачинено і чи може він вийти.
Господарю не обов“язково знати, що кіт розумний та як кіт це перевіряє, але кіт це робить (скажімо, смикаючи ручку дверей :) ) та сигналізує гучним «мяу», що вийти він не може :), або виходить :).
Яким чином ми реалізуємо цей «функціонал»? :)
Ми додаємо ще один метод, але він буде приватним.
class Cats //Об“являємо та описуємо клас котів
{private:
string name;
int age;
bool CheckDoor() //Створимо булеву функцію(метод) для перевірки стану дверей. Для спрощення ставимо «зачинені».
{return false;}
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;}
void GoWalk() // Кіт іде на прогулянку: перевірка дверей
{bool m=CheckDoor();
if (m)
{cout <<“Кіт “<<name<<“ іде на прогулянку.“<<endl;}
else
{cout <<“Мяяяяуууу“<<endl;}
};
Тепер ми можемо використати цей приват-метод, де кіт перевіряє, чи зачинені двері (в нашому випадку саме так) :).
іnt main ()
{
int a;
string A;
Cats cat1;
cout<< “Як звуть Вашого кота?“<<endl;
cin>>A;
cout<<“Скільки йому років?“<<endl;
cin>>a;
cat1.SetName (A);
cat1.SetAge(a+1);
cat1.Print();
cat1.GoWalk();
return 0;
}
Що ми отримали? Наш кіт видає гучне «Мяу» :).
А якщо ми в методі замінимо false на true (тобто наш кіт лапою смикнув та відчинив двері)? Правильно, отримаємо відпрацьований функціонал «Кіт пішов на прогулянку». :)
Напряму використати в main метод ми не можемо. Чому? Правильно, тому що він private, і прямий доступ до нього закрито. Але, як і в випадку використання геттерів та сеттерів для доступу до властивостей, тобто, полів класу, ми можемо зробити це через паблік-методи, які всередині класу можуть взаємодіяти з приват-методами.
Напишіть за аналогією програму для тостера, який після натисканні кнопки «Вкл» буде перевіряти, чи піходить для його роботи напруга в мережі.
Творчої наснаги :).