OOP-l6_-3(лекция 8).ppt
- Количество слайдов: 17
Лекція № 8 Типи успадкування за областями доступу (відкрите та закрите успадкування). Множинне успадкування.
Private у суперкласі Якщо під час оголошення класу його суперклас оголосити private, то підклас спадкує структуру та поведінку, але не буде підтипом: n n відкриті та захищені члени суперкласу стануть закритими членами підкласу, звідси вони будуть недосяжні для підкласів більш низького рівня. підкласу та суперкласу будуть властиві (взагалі кажучи) несумісні інтерфейси з точки зору клієнта.
Приклад 8. 1. Дані космічних апаратів
Приклад 8. 1. Відкрите та закрите успадкування class Internal. Electrical. Data: class Telemetry. Data { public: private Electrical. Data { Telemetry. Data(); virtual ~Telemetry. Data(); public: virtual void transmit(); //передача даних Internal. Electrical. Data(float v 1, Time current. Time() const; float v 2, float a 1, float a 2); protected: int id; //ключ для ідентифікації даних virtual ~Internal. Electrical. Data(); Time time. Stamp; //часові мітки float Electrical. Data: : current. Power(); }; class Electrical. Data: public Telemetry. Data { public: Electrical. Data(float v 1, float v 2, float a 1, float a 2); virtual ~Electrical. Data(); void transmit(); float current. Power() const; //розвив потужність protected: float fuel. Cell 1 Voltage, fuel. Cell 2 Voltage; //напруга в електробатареях float fuel. Cell 1 Amperes, fuel. Cell 2 Amperes; // струм в електробатареях };
Приклад 8. 1. Структура об’єктів при успадкуванні Telemetry. Data A Internal. Electrical. Data С // private Electrical. Data public: Internal. Electrical. Data(float v 1, float v 2, float a 1, float a 2); virtual ~Internal. Electrical. Data(); float Electrical. Data: : current. Power(); private: Telemetry. Data(); current. Time(); Electrical. Data(float v 1, float v 2, float a 1, float a 2); virtual ~Electrical. Data(); void transmit(); int id; time. Stamp; float fuel. Cell 1 Voltage, fuel. Cell 2 Voltage; float fuel. Cell 1 Amperes, fuel. Cell 2 Amperes; public: Telemetry. Data(); virtual transmit(); current. Time(); protected: int id; time. Stamp; Electrical. Data B // public Telemetry. Data public: Telemetry. Data(); current. Time(); Electrical. Data(float v 1, float v 2, float a 1, float 2); virtual ~Electrical. Data(); void transmit(); // перевизначено float current. Power(); protected: int id; time. Stamp; float fuel. Cell 1 Voltage, fuel. Cell 2 Voltage; float fuel. Cell 1 Amperes, fuel. Cell 2 Amperes;
Висновок з прикладу В цьому прикладі суперклас закритий, звідси: 1. його методи недосяжні для клієнтів; 2. підклас не є підтипом; 3. об‘єкти підкласу не можна присвоювати об‘єктам суперкласу; 4. функція current. Power() видима завдяки її явній кваліфікації (інакше вона була б недосяжною).
Перехід областей доступу при різних типах успадкування public protected private protected private не не не успадковується Тип успадкування Область доступу
Множинне успадкування Означення: Множинне успадкування – це відношення між класами, коли один клас повторює структуру та поведінку декількох інших класів. Приклад множинного успадкування class student { protected: char* name; }; class worker { protected: char* name; }; class student_worker: public student, public worker { public: print() { cout<<name}; };
Проблеми множинного успадкування Student ______ Worker ______ name Student_worker _______ Student: name Worker: name class student: public person {. . . };
Проблеми множинного успадкування Person ______ name Student _______ Worker _____ name Student_worker _______ Student: name Worker: name
Проблеми множинного успадкування Person ______ virtual name virtual Worker Student_worker name Student: name Worker: name
Проблеми множинного успадкування конфлікт імен між суперкласами в C++ усувається шляхом додавання префікса (повної кваліфікації) повторне успадкування: один клас є спадкоємцем іншого за кількома лініями n n n можна заборонити (Smalltalk) можна розвести дві копії успадкованого елемента, додаючи до імен префікси у вигляді імені класу-джерела (С++) множинні посилання на один і той же клас можна розглядати як один клас (С++); суперклас, що повторюється, визначається як віртуальний базовий клас (віртуальне успадкування)
Множинне успадкування При множинному успадкуванні використовується прийом створення домішок (mixin) — класів, не призначених для породження самостійних примірників, а для змішування з іншими класами (Insurable. Item, Interest. Bearing. Item). Домішка — це клас, який виражає не поведінку, а одну звичку. Класи, сконструйовані з домішок, називаються агрегатними. Використання множинного успадкування: Множинне успадкування використовується, якщо існує декілька ортогональних наборів ознак, за якими можна згрупувати кінцеві класи і ці групи перекриваються. В Java множинне успадкування не використовується. n n Натомість працює механізм реалізації інтерфейсів. Клас успадковує (extends) структуру та поведінку лише одного класу та може реалізовувати (implements) довільну кількість інтерфейсів
Множинне успадкування в бібліотеці потокового введення-виведення С++ ios - базовый потоковый класс; istream - класс входных потоков; ostream - класс выходных потоков; iostream - класс двунаправленных потоков ввода-вывода;
Класи ієрархії успадкування потокового введення-виведення ios - базовый потоковый класс; istream - класс входных потоков; ostream - класс выходных потоков; iostream - класс двунаправленных потоков ввода-вывода; istrstream - входные строковые потоки; ostrstream - выходные строковые потоки; strstream - класс двунаправленных строковых потоков (ввода-вывода); ifstream - входные файловые потоки; ofstream - выходные файловые потоки; fstream - класс двунаправленных файловых потоков (ввода-вывода); constream - класс консольных выходных потоков. Как наглядно видно из диаграммы классов, класс ios является базовым для классов ostream, istream, и опосредовано базовым для всех остальных потоковых классов. Все общие средства потоковых классов помещаются в класс ios. Например, при помощи методов и данных класса ios осуществляется управление процессом передачи символов из буфера и в буфер. При выполнении этих действий необходимы, например, сведения о нужном основании счисления (восьмеричное, десятичное, шестнадцатеричное), о точности представления вещественных чисел, и т. д. Класс ios содержит эти сведения, т. е. (методы) функции и данные, относящиеся к состояниям потоков и позволяющие менять их свойства. Потоковые классы, их данные и методы становятся видимыми и доступными в программе, если в нее включен нужный заголовочный файл: iostream. h - для классов ios, istream, ostream, stream; strstrea. h - для классов istrstream, ostrstream, strstream; fstream. h - для классов ifstream, ofstream, fstream; constrea. h - для класса constream.
Відношення між класами та об’єктами Класи і об'єкти тісно пов'язані поняття. Будь-який об'єкт належить деякому класу. Клас породжує будь-яке число об'єктів. Класи статичні (всі їх особливості і зміст визначаються в процесі компіляції). Об'єкти динамічні, тобто створюються і знищуються в процесі виконання програми. На етапі аналізу і ранніх стадіях проектування вирішується дві основні задачі: n n виявлення класів і об'єктів, що складають словник предметної області побудова структур, що забезпечують взаємодію об'єктів, при яких виконуються вимоги задачі
Якість об’єктів Якість класів і об'єктів визначається критеріями: n n зчеплення - міра глибини зв'язків між окремими модулями або класами суперечність: треба прагнути до мінімального зачеплення, але успадкування передбачає сильне зчеплення
OOP-l6_-3(лекция 8).ppt