Бублик Володимир Васильович Об'єктно-орієнтоване програмування Частина 2. Ієрархічне програмування. Лекція 10. Успадкування реалізації (закрите і захищене)

Презентация:



Advertisements
Похожие презентации
Бублик Володимир Васильович Об'єктно-орієнтоване програмування Частина 2. Ієрархічне програмування. Лекція 9. Відкрите успадкування Лекції для студентів.
Advertisements

Бублик Володимир Васильович Об'єктно- орієнтоване програмування Частина 2. Ієрархічне програмування. Лекція 12. Ітераторні контейнери Лекції для студентів.
Верона (Італія). Арена, І ст. Якби будівельники будували будинки так, як програмісти складають програми, досить було б залетіти одному дятлу, щоб зруйнувати.
Бублик Володимир Васильович Об'єктно-орієнтоване програмування Частина 1. Об'єктне програмування. Лекція 7. Контейнерні класи Лекції для студентів 2 курсу.
Бублик Володимир Васильович Об'єктно-орієнтоване програмування Частина 1. Об'єктне програмування. Лекція 3. Права доступу Лекції для студентів 2 курсу.
Бублик Володимир Васильович Об'єктно- орієнтоване програмування Частина 2. Ієрархічне програмування. Лекція 11. Поліморфізм Лекції для студентів 2 курсу.
Бублик Володимир Васильович Об'єктно-орієнтоване програмування Частина 1. Об'єктне програмування. Лекція 4. Ієрархія обєктів: композиція і агрегація Лекції.
Бублик Володимир Васильович Об'єктно-орієнтоване програмування Частина 1. Об'єктне програмування. Лекція 1. Принцип інкапсуляції Лекції для студентів 2.
Бублик Володимир Васильович Об'єктно-орієнтоване програмування Частина 1. Об'єктне програмування. Лекція 2. Копіювання об'єктів Лекції для студентів 2.
Класи пам'яті даних. Клас пам'яті, час існування та видимість об'єкта Кожен обєкт програми (змінна, функція,...) має свій тип і клас памяті. Тип визначає.
Бублик Володимир Васильович Об'єктно-орієнтоване програмування Частина 1. Об'єктне програмування. Лекція 5. Програмовані операції Лекції для студентів.
Бублик Володимир Васильович Програмування - 2 Лекція 3. Об'єктне програмування. Права доступу Лекції для студентів 2 курсу.
Урок № 25, 26 8 клас. Компоненти «Кнопка», «Напис» середовища Lazarus
Бублик Володимир Васильович Об'єктно-орієнтоване програмування Частина 1. Об'єктне програмування. Лекція 8. Параметризовані класи Лекції для студентів.
СЗШ І-ІІІ ступенів с.Старичі Діаграми в Excel Графічний аналіз даних.
Бублик Володимир Васильович Об'єктно-орієнтоване програмування Частина 1. Об'єктне програмування. Лекція 6. Типізація членів класу Лекції для студентів.
Місячне затемнення
Бази даних Поняття про моделі даних. Види моделей даних Бази даних.
Важливою проблемою всієї криптографії з відкритим ключем, в тому числі і систем ЕЦП, є управління відкритими ключами. Так як відкритий ключ доступний.
База даних (БД) це структурована сукупність взаємопов'язаних даних певної предметної області (реальних об'єктів, процесів, явищ тощо). це структурована.
Транксрипт:

Бублик Володимир Васильович Об'єктно-орієнтоване програмування Частина 2. Ієрархічне програмування. Лекція 10. Успадкування реалізації (закрите і захищене) Лекції для студентів 2 курсу Fort, Copenhagen

Off top Виявляється, що закрите успадкування взагалі більше схоже на агрегацію, а захищене так просто небезпечне © Бублик В.В. ООП-2. Ієрархічне програмування. Лекція 10. Успадкування реалізації (закрите і захищене) 2

3 Захищена частина класу Посилення родинних стосунків Виділимо похідні класи серед усіх інших клієнтів базового класу, надавши їм право доступу до особливої захищеної частини класу class Base { public: //доступно для всіх protected: //доступно лише для похідних класів private: //недоступно зовні класу };

© Бублик В.В. ООП-2. Ієрархічне програмування. Лекція 10. Успадкування реалізації (закрите і захищене) 4 Захищені атрибути прямокутника class Rectangle { protected: length_t _height, _width; public: Rectangle (length_t heigh=10, length_t width=20); length_t getA() const; length_t getB() const; Rectangle& setA(length_t); Rectangle& setB(length_t); length_t area() const; length_t diagonal() const; };

© Бублик В.В. ООП-2. Ієрархічне програмування. Лекція 10. Успадкування реалізації (закрите і захищене) 5 Атрибути прямокутника доступні квадрату length_t DerivedSquare::area() const { return _width * _height ; } const double sqrt2 = sqrt(2.); length_t DerivedSquare::diagonal() const { return _height * sqrt2; }

© Бублик В.В. ООП-2. Ієрархічне програмування. Лекція 10. Успадкування реалізації (закрите і захищене) 6 Порушення інкапсуляції Кожен похідний класу тепер має доступ до захищеної частини базового класу і передає його своїм похідним класам class Destroyer: public DerivedSquare { public: void distroySquare() { //невиправданий доступ до захищеної // частини прямокутника _height = 5;} };

© Бублик В.В. ООП-2. Ієрархічне програмування. Лекція 10. Успадкування реалізації (закрите і захищене) 7 Руйнування об'єкту Destroyer foo; cout<<foo.area()<<endl; //100 foo.distroySquare();//_height/=2; cout<<foo.area()<<endl;//25 DerivedSquare & dsq=foo; cout<<dsq.area()<<endl; //25 Rectangle & rec = foo; cout<<rec.area()<<endl; //50????

© Бублик В.В. ООП-2. Ієрархічне програмування. Лекція 10. Успадкування реалізації (закрите і захищене) 8 Порушення інкапсуляції Кожен похідний клас може навіть відкрити доступ до захищеної частини базового класу class MoreDestroyer: public DerivedSquare { public: Rectangle :: _height }; MoreDestroyer x; x._height = -10; cout<<s.area(); //????

© Бублик В.В. ООП-2. Ієрархічне програмування. Лекція 10. Успадкування реалізації (закрите і захищене) 9 Порушення інкапсуляції Будь-який клас можна зробити похідним від будь-якого іншого базового класу (плата за правило зозулі ) Захищені атрибути дають можливість зайти до базового класу з чорного ходу Голчине вушко

© Бублик В.В. ООП-2. Ієрархічне програмування. Лекція 10. Успадкування реалізації (закрите і захищене) 10 Звязок успадкування з правами доступу Відкрите успадкування: передача прав доступу без змін Захищене успадкування: пониження відкритого до захищеного Закрите успадкування: все закривається, але… похідний клас на власний розсуд може відкрити все, до чого він має доступ

© Бублик В.В. ООП-2. Ієрархічне програмування. Лекція 10. Успадкування реалізації (закрите і захищене) 11 Гібрид масиву зі стеком class StackDerivedFromArray: public Array { private: static const size_t _bos;size_t _top; public: explicit StackDerivedFromArray(size_t size): Array (size),_top(_bos) {}; ~StackDerivedFromArray() {}; bool empty() const; bool full() const; const Elem& top() const; void pop(); void push(Elem value); size_t size() const; size_t volume() const; };

Повторення Скотт Мейерс: Найважливіше правило об'єктно- орієнтованого програмування на С++ звучить так: відкрите успадкування означає, що один клас є різновидом (підтипом) іншого (public inheritance means «is a»). Твердо запам'ятайте це. © Бублик В.В. ООП-2. Ієрархічне програмування. Лекція 10. Успадкування реалізації (закрите і захищене) 12

© Бублик В.В. ООП-2. Ієрархічне програмування. Лекція 10. Успадкування реалізації (закрите і захищене) 13 Порушення правила Скотта Мейерса Чи має стек право поводитися як масив? StackContainingArray stachar(100); //беремо з порожнього стеку cout<<stachar[0]<<endl; //кладемо безсистемно stachar[10]=a; stachar[20]=b; //беремо не там, куди клали cout<<stachar[15]<<endl;

© Бублик В.В. ООП-2. Ієрархічне програмування. Лекція 10. Успадкування реалізації (закрите і захищене) 14 Закриємо операцію індексування class StackDerivedFromArray: public Array { private: static const size_t _bos; size_t _top; Array ::operator []; public: explicit StackDerivedFromArray(size_t size): Array (size),_top(_bos) {}; ~StackDerivedFromArray() {}; ……………………………………………………….. };

© Бублик В.В. ООП-2. Ієрархічне програмування. Лекція 10. Успадкування реалізації (закрите і захищене) 15 Проблема залишається Через операцію розв'язання області дії добираємося до індексування (єдина надія, що не кожен клієнт зуміє до неї добратися) StackDerivedFromArray stachar(100); stachar.Array ::operator[](30)='A';

© Бублик В.В. ООП-2. Ієрархічне програмування. Лекція 10. Успадкування реалізації (закрите і захищене) 16 Більше того Можна взагалі забути про те, що це був стек, і поводитися з ним так, наче він просто масив StackDerivedFromArray stachar(100); Array &ar = stachar;

© Бублик В.В. ООП-2. Ієрархічне програмування. Лекція 10. Успадкування реалізації (закрите і захищене) 17 Стек з підгляданням //Стек з підгляданням став похідним від стеку template class PeekbackStackDerivedFromArray : public StackDerivedFromArray { public: //Власні методи підглядача PeekbackStackDerivedFromArray(size_t size): StackDerivedFromArray (size){}; ~PeekbackStackDerivedFromArray(){}; bool peekback(size_t i, Elem& elem) const; };

© Бублик В.В. ООП-2. Ієрархічне програмування. Лекція 10. Успадкування реалізації (закрите і захищене) 18 Реалізація підглядань bool PeekbackStackDerivedFromArray :: peekback (size_t i, Elem& elem) const { if (i>=size()) { elem = top(); return false; } elem = (* this)[i]; return true; };

© Бублик В.В. ООП-2. Ієрархічне програмування. Лекція 10. Успадкування реалізації (закрите і захищене) 19 Досягнення програміста-початківця Стек з підгляданням став повноцінним стеком, а незручну форму індексування можна поправити змінивши статус операції індексування на захищений class StackDerivedFromArray: public Array { private: static const size_t _bos; size_t _top; protected: Array ::operator []; …………………………………………………… };

© Бублик В.В. ООП-2. Ієрархічне програмування. Лекція 10. Успадкування реалізації (закрите і захищене) 20 Проблема Закриття безпосереднього доступу до операції індексування не розв'язує проблему повністю: залишилася можливість опосередкованого (через розв'язання області дії) доступу до індексування клієнтам як стеку, так і стеку з підгляданням Вихід: Доповнити відкрите успадкування новим типом успадкувань захищеним успадкуванням

© Бублик В.В. ООП-2. Ієрархічне програмування. Лекція 10. Успадкування реалізації (закрите і захищене) 21 Захищене успадкування Закриває клієнтам похідного класу доступ до базового класу Самому похідному класу відкрито доступ до відкритої і захищеної частини базового класу, причому відкрита і захищена частини базового класу одержують статус захищеної частини похідного

© Бублик В.В. ООП-2. Ієрархічне програмування. Лекція 10. Успадкування реалізації (закрите і захищене) 22 Транзитивність захищеного успадкування Захищене успадкування забезпечує транзитивність захищеного доступу вздовж ланцюжка успадкувань

© Бублик В.В. ООП-2. Ієрархічне програмування. Лекція 10. Успадкування реалізації (закрите і захищене) 23 Обмежений доступ до масиву class StackDerivedFromArray: protected Array { private: static const size_t _bos;size_t _top; public: explicit StackDerivedFromArray(size_t size): Array (size),_top(_bos) {}; ~StackDerivedFromArray() {}; bool empty() const; bool full() const; const Elem& top() const; void pop(); void push(Elem value); size_t size() const; size_t volume() const; };

© Бублик В.В. ООП-2. Ієрархічне програмування. Лекція 10. Успадкування реалізації (закрите і захищене) 24 Діаграма класів Захищене успадкування закриває клієнтам доступ до базового класу Похідним класам базовий клас доступний

© Бублик В.В. ООП-2. Ієрархічне програмування. Лекція 10. Успадкування реалізації (закрите і захищене) 25 Відновлення правила Скотта Мейерса Стеки більше не поводяться як масиви StackDerivedFromArray stachar(100); cout<<stachar [0]<<endl;//ERROR!!! stachar.Array ::operator[](30)='A';//ERROR!!! PeekbackStackDerivedFromArray pbstachar(100); cout<<pbstachar [0]<<endl;//ERROR!!! pbstachar.Array ::operator[](30)='A';//ERROR!!!

© Бублик В.В. ООП-2. Ієрархічне програмування. Лекція 10. Успадкування реалізації (закрите і захищене) 26 Стековий шахрай template class PeekbackStackCheat : public PeekbackStackDerivedFromArray { public: PeekbackStackCheat(size_t size): PeekbackStackDerivedFromArray(size){}; //Відкритий доступ до захищеної частини Array ::operator []; };

© Бублик В.В. ООП-2. Ієрархічне програмування. Лекція 10. Успадкування реалізації (закрите і захищене) 27 Порушення інкапсуляції триває PeekbackStackCheat cheat(10); //Ховаємо шахрая під стеком PeekbackStackDerivedFromArray & hiddenCheat = cheat; hiddenCheat.push('a'); hiddenCheat.push('b'); cout<<hiddenCheat<<endl;//a, b //Шахраюємо cheat[0]='V'; cheat[1]='W'; cout<<hiddenCheat<<endl;// V, W

© Бублик В.В. ООП-2. Ієрархічне програмування. Лекція 10. Успадкування реалізації (закрите і захищене) 28 Закрите успадкування Посилюємо обмеження Повністю закриваємо клієнтам похідного класу доступ до базового класу

© Бублик В.В. ООП-2. Ієрархічне програмування. Лекція 10. Успадкування реалізації (закрите і захищене) 29 Закрите успадкування class StackDerivedFromArray: private Array { private: static const size_t _bos;size_t _top; protected: //Вимушене послаблення для підглядань Array ::operator []; public: explicit StackDerivedFromArray(size_t size): Array (size),_top(_bos) {}; ~StackDerivedFromArray() {}; ………………………………………………………………… };

© Бублик В.В. ООП-2. Ієрархічне програмування. Лекція 10. Успадкування реалізації (закрите і захищене) 30 Надання доступу При необхідності доступ можна відкрити з будь-яким статусом: захищеним чи відкритим protected: //Відкрили доступ похідному класу //тільки до операції індексування Array ::operator [];

© Бублик В.В. ООП-2. Ієрархічне програмування. Лекція 10. Успадкування реалізації (закрите і захищене) 31 Діаграма Клієнтам стеку доступ до масиву закритий Похідним класам стеку надано захищений доступ до операції індексування

© Бублик В.В. ООП-2. Ієрархічне програмування. Лекція 10. Успадкування реалізації (закрите і захищене) 32 Нічого не змінилося: порушення тривають PeekbackStackCheat cheat(10); //Ховаємо шахрая під стеком PeekbackStackDerivedFromArray & hiddenCheat = cheat; hiddenCheat.push('a'); hiddenCheat.push('b'); cout<<hiddenCheat<<endl;//a, b //Шахраюємо cheat[0]='V'; cheat[1]='W'; cout<<hiddenCheat<<endl;// V, W

© Бублик В.В. ООП-2. Ієрархічне програмування. Лекція 10. Успадкування реалізації (закрите і захищене) 33 Порівняйте три схеми успадкувань

© Бублик В.В. ООП-2. Ієрархічне програмування. Лекція 10. Успадкування реалізації (закрите і захищене) 34 Недоліки схем успадкування Відкрите успадкування дало підгляданню повний доступ до масиву, але перетворило стек на масив Всі типи успадкування порушують інкапсуляцію, даючи несанкціонований доступ до масиву клієнтам (відкрите успадкування) або похідним класам (захищене успадкування) стеку з підгляданням. Закрите успадкування закриває доступ повністю, але вимагає послаблень у вигляді зміни статусу доступу до індексування на захищений.

© Бублик В.В. ООП-2. Ієрархічне програмування. Лекція 10. Успадкування реалізації (закрите і захищене) 35 Вихід Замість заміни статусу доступу використаємо делегування через допоміжну функцію Накладні витрати: зайвий виклик Переваги: захист від несанкціонованого доступу

© Бублик В.В. ООП-2. Ієрархічне програмування. Лекція 10. Успадкування реалізації (закрите і захищене) 36 Ремонт закритого успадкування class StackDerivedFromArray: private Array { protected: //Делегування лише селектора const Elem& operator[] (size_t index) const { return (*this)[index]; }; public: explicit StackDerivedFromArray(size_t size): Array (size),_top(_bos) {}; ~StackDerivedFromArray() {}; ………………………………………………………………… };

© Бублик В.В. ООП-2. Ієрархічне програмування. Лекція 10. Успадкування реалізації (закрите і захищене) 37 Делегування Делегування стеку з підгляданням захищеного доступу до оператора індексування в ролі селектора найбільш повно відповідає завданню стека з підгляданням Похідні класи від стеку з підгляданням не можуть нашкодити, оскільки вони одержать (з точністю до виходу за межі стеку) не більше доступу, ніж дає операція підглядання

© Бублик В.В. ООП-2. Ієрархічне програмування. Лекція 10. Успадкування реалізації (закрите і захищене) 38 Досягнення делегування PeekbackStackDerivedFromArray stachar(100); stachar[0]; //ERROR OverPeekback over(100); over.push('a'); over.push('b'); over.push('c'); //Можна лише підглянути (не завжди коректно) cout<<over[0]<<','<<over[5]<<endl; //але не змінити over[0] = 'V'; //ERROR

© Бублик В.В. ООП-2. Ієрархічне програмування. Лекція 10. Успадкування реалізації (закрите і захищене) 39 Успадкування реалізації Захищене і закрите успадкування не надають своїм клієнтам доступ до базового класу Закрите успадкування дозволяє похідному класу використовувати (реалізацію) базового класу, а захищене успадкування передає це право далі по ланцюжку успадкувань Чим тоді закрите успадкування відрізняється від вкладень? З точки зору клієнта нічим

© Бублик В.В. ООП-2. Ієрархічне програмування. Лекція 10. Успадкування реалізації (закрите і захищене) 40 Назад до агрегації Операція індексування делегується масиву

© Бублик В.В. ООП-2. Ієрархічне програмування. Лекція 10. Успадкування реалізації (закрите і захищене) 41 Делегування індексного селектора class StackAggregatingArray { public: StackAggregatingArray(size_t); ~StackAggregatingArray(); const Elem& top() const; void pop(); void push(const Elem& value); private: Array * _pstackArray;…………………………………… protected: const Elem& operator[] (size_t index) const { return (* _pstackArray)[index]; }; };

© Бублик В.В. ООП-2. Ієрархічне програмування. Лекція 10. Успадкування реалізації (закрите і захищене) 42 Яку з них вибрати? Жодної!

© Бублик В.В. ООП-2. Ієрархічне програмування. Лекція 10. Успадкування реалізації (закрите і захищене) 43 Закрите успадкування vs. агрегація Чи потрібне закрите успадкування? Герб Саттер: Скрізь, де можна, віддавайте перевагу агрегації Агрегація указником гнучкіша: досить оголошення Допускає делегування Модифікація коду базового класу вимагає перекомпіляції всіх похідних класів, модифікація агрегованого об'єкту ні