В чому полягає принцип спадковості. Що таке одинична та множинна спадковості. Як реалізується принцип одиничної та множинної спадковості в об’єктно-орієнтованих мовах Програмування. 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

В чому полягає принцип спадковості. Що таке одинична та множинна спадковості. Як реалізується принцип одиничної та множинної спадковості в об’єктно-орієнтованих мовах Програмування.



Принцип спадковості означає, що якщо ви хочете створити новий клас, що лише трохи відрізняється від старого, то абсолютно немає необхідності в переписуванні заново вже існуючих полів і методів. Ви оголошуєте, що новий класс N ew O bject=class (T O ld O bject); є нащадком або дочірнім класом старого класу T O ld O bject, званого предком або батьківським класом, і додаєте до нього нові поля, методи і властивості - іншими словами, те, що потрібне при переході від загального до приватного. У Object Pascal всі класи є нащадками класу T O bject. Успадковані від класу-предка поля і методи доступні в дочірньому класі; якщо має місце збіг імен методів, то говорять, що вони перекриваються.

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

Мову C++ допускає так зване множинне спадкування. В цьому випадку новий клас може успадковувати частину своїх елементів від одного батьківського класу, а частина — від іншого. Множинне спадкування створює відому проблему (у C++), коли клас успадковується від декількох класів-посередників, які у свою чергу успадковуються від одного класу. Якщо метод загального предка був перевизначений в посередниках, невідомо, яку реалізацію методу повинен успадковувати загальний нащадок. Вирішується ця проблема шляхом відмови від множинного спадкоємства для класів і дозволом множинного спадкування для повністю абстрактних класів (т.з. інтерфейсів) (C#, Delphi, Java). У Object Pascal поняття множинного спадкування відсутнє. Якщо ви хочете, щоб новий клас об'єднував властивості декількох, створіть класи-предки один від одного або об’єднайте в одному класі декілька полів, відповідних іншим бажаним класам.

Одиничне спадкування: Множинне спадкування:
C сlass A{ int a,b;};сlass B:<ключ доступа> A{ }; C сlass A{};сlass B{};сlass C{};сlass D:<ключ доступу> A, <ключ доступу> B, <ключ доступу> C{ };        ключ доступу–public, private, protected
Delphi Type  TMyClass = class (TObject) a,b: Integer; c:word; procedure p1; abstract;virtual; procedure p2; abstract;virtual;end;TClass1 = class (TMyClass) procedure p1; override; procedure p2; override;end; Delphi Type A= class (TObject) Procedure p1; abstract; virtual;end;B= class (TObject) Procedure p3; abstract; virtual;end;TClass1 = class (A) procedure p1; override; obj:B;end;

 

7. В чому полягає принцип інкапсуляції? Як реалізується принцип інкапсуляції в об’єктно-орієнтованих мовах програмування (охарактеризуйте директиви видимості, що застосовуються при описі класів)? Як регламентувати доступ до захищених полів об’єкта?

Для забезпечення надійності небажаний прямий доступ до полів об'єкту: читання і оновлення їх вмісту повинні вироблятися за допомогою виклику відповідних методів. Це правило і є інкапсуляція. У моделі об'єктів мови Object Pascal існує механізм доступу до составних частин об'єкту, що визначає області, де ними можна користуватися (зони видимості). Поля і методи можуть відноситися до 5 груп (секціям), що відрізняються зонами видимості. Методи та властивості можуть бути загальними (секція public), особистими (секція private), захищеними (секція protected) і опублікованими (секція published), для створення OLE об'єктів (секція automized).Поля, властивості і методи секції public не мають обмежень на видимість. Вони доступні з інших функцій і методів об'єктів, як в даному модулі, так і у всіх інших, таких, що посилаються на нього. Поля, властивості і методи, що знаходяться в секції private, доступні лише в методах класу і у функціях, що містяться в тому ж модулі, що і описуваний клас. Така директива дозволяє повністю приховати деталі внутрішньої реалізації класу. Властивості і методи з секції private можна змінювати, і це не позначатиметься на програмах, що працюють з об'єктами цього класу. Єдиний спосіб для когось іншого звернутися до них — переписати заново створений вами модуль. Поля, властивості і методи секції protected також доступні лише усередині модуля з описуваним класом. Але, вони доступні і в класах, що є нащадками даного класу, у тому числі і в інших модулях. Нарешті, зона видимості, що визначається четвертою директивою, — published, має особливе значення для інтерфейсу візуального проектування Delphi. У цій секції мають бути зібрані ті властивості об'єкту, які будуть видні не лише під час виконання додатка, але і з середовища розробки. Три зони видимості — private, protected, public — як би впорядковані за збільшенням видимості методів. У класах-нащадках можна підвищити видимість методів і властивостей, але не знизити її. При описі дочірнього класу можна переносити методи і властивості з однієї сфери відимості в іншу, не переписуючи їх заново і навіть не описуючи - досить згадати про нього у іншому місці. 

Приклад інкапсуляції та методів регламентації доступу до захищеніх полів об’єкта:

C СlassA:<ключ доступу> B{private: int a,b; void Do_Something(void);protected: B::long c; }; Delphi TMyClass = class private FMyField: Integer;Procedure SetMyField(const Value: Integer);function GetMyField: Integer; public property MyField: Integer read GetMyField write SetMyField; end;

 

В чому полягає принцип поліморфізму? Як реалізується принцип поліморфізму в об’єктно-орієнтованих мовах програмування? Обґрунтуйте доцільність використання віртуальних або динамічних методів. Як здійснити виклик з методів потомка перекритих (віртуалізованих) методів предка?

Метою поліморфізму є використання одного імені для задання загальних для класу дій. Виконання кожної конкретної дії визначатиметься типом даних. Наприклад для мови С, в якому поліморфізм підтримується недостатньо, знаходження абсолютної величини числа вимагає трьох різних функцій: abs (), labs() і fabs(). Ці функції підраховують і повертають абсолютну величину цілих, довгих цілих і чисел з плаваючою крапкою відповідно. У С++ кожна з цих функцій може бути названа abs (). Тип даних, який використовується при виклику функції, визначає, яка конкретна версія функції дійсно виконується. У С++ можна використовувати одне ім'я функції для безлічі різних дій. Це називається перевантаженням функцій (function overloading). У загальнішому сенсі, концепцією поліморфізму є ідея "один інтерфейс, безліч методів". Поліморфізм може застосовуватися також і до операторів. Фактично у всіх мовах програмування обмежено застосовується поліморфізм, наприклад, в арифметичних операторах. Так, в С, символ + використовується для складання цілих, довгих цілих, символьних змінних і чисел з плаваючою крапкою. В цьому випадку компілятор автоматично визначає, який тип арифметики потрібний. У С++ ви можете застосувати цю концепцію і до інших, заданим вами, типам даних. Такий тип поліморфізму називається перевантаженням операторів (operator overloading). Ключовим в розумінні поліморфізму є те, що він дозволяє вам маніпулювати об'єктами різної міри складності шляхом створення загального для них стандартного інтерфейсу для реалізації схожих дій. Приклад. Клас геометричних фігур (еліпс, багатокутник) може мати методи для геометрі-чеських трансформацій (зсув, поворот, масштабування). У об'єктно-орієнтованих мовах клас є типом даних. Поліморфізм реалізується за допомогою спадкоємства класів. Клас-нащадок успадковує сигнатури методів класу-батька, але реалізація цих методів може бути іншій, відповідній специфіці класу-нащадка. Це називається перевизначенням методу. Інші функції можуть працювати з об'єктом класу-батька, при цьому замість нього під час виконання підставлятиметься один з класів-нащадків. Це називається пізнім скріпленням. Залежно від того, які дії відбуваються при виклику, методи діляться на три групи. У першу групу віднесемо статичні методи, в другу - віртуальні (virtual) і динамічні (dynamic) і, нарешті, в третю - перенавантажувані (overload) методи. Методи першої групи повністю перекриваються в класах-нащадках при їх перевизначенні. При цьому можна повністю змінити оголошення методу. Методи другої групи при спадкоємстві повинні зберігати найменування і тип. Перевантажені методи доповнюють механізм спадкоємства можливістю використовувати потрібний варіант методу (власний або батьківський) залежно від умов вживання. Абстрактні методи не мають реалізації взагалі. Вони спеціально призначені для спадкоємства. Їх реалізація має бути визначена в класах-нащадках. Віртуальні методи – займають більше місця, але швидше обробляються. Динамічні – менше місця, але повільніше обробляються. Класові методи (class) – Класові методі можна віклікаті без створення екземпляру класу, а через посилання на клас. Хоча класові методі можна викликати також з екземпляра об'єкту, але реалізація класових методів не може посилатися на конкретне полі, або інший некласовій метод. На конструктор та на інші класові методі посилатися можна. Класові методі, зазвичай, модификують глобальні дані або відають інформацію про клас. Коли з класу-нащадку необхідно викликати одноімений метод предка, що був заміщеній (або перекритий) цим нащадком. Для цього використовується спеціальна директива inherited. Загальній опис використання такий: inherited < ім’я методу предка>.

Призначення параметризованих функцій та параметризованих класів. У яких випадках доцільно використовувати параметризовану функцію, а у яких групу перевантажених функцій. Призначення класів-шаблонів та їх використання. Як на UML діаграмі класів відображаються параметризовані класи?

В Pascal параметризованих функцій і класів немає. У С++ це родові функції і класи. Родова функція визначає базовий набір операцій, кіт будуть застосуються до різних типів даних. Родова функція оперує з тим типом даннях, який вона отримує як параметра. За допомогою цього механізму одна і та ж процедура може застосуються до самих різних типів даннях. Завдяки створенню родовий функції ми можемо не залежно від типа даннях визначити суть алгоритму. Після того, як це зроблено, компілятор автоматично генерує правильний код для фактично використовуваного при виконанні функції типа даних. По суті, при створенні родової функції ви створюєте функцію, котра може автоматично перевантажуватися сама. Родова функція створюється за допомогою ключового слова template. Воно призначене для створення шаблону, який описує те, що робитиме функція, при цьому компілятору залишається доповнити шаблон необхідними деталями. На додаток до родових функції визначені родові класи(класи-шаблони). При цьому створюється клас, в якому визначені всі необхідні алгоритми, а фактичні типи оброблюваних даних задаються як параметри пізніші, при створенні об'єктів цього класу. За допомогою родового класу можна створити клас, що реалізовує чергу, зв’язані списки т.д. для будь-яких типів даних. Компілятор автоматично генеруватиме правильного типа об'єкту на основі типа, заданого при створенні об'єкту. Бібліотека стандартних шаблонів (STL). Ядро STL образу ют 3 елементи: контейнери (об'єкти призначені для зберігання інших об'єктів), алгоритми і ітератори. Контейнери бувають різних типів. Наприклад в класі-контейнері vector (вектор) визначається динамічний масив. У класі тap – асоціативний список для зберігання пар ключ/значення, де з кожним ключем пов'язано лише одне значення. У класі stek – визначається стек. У разі, коли функція виконуватиме різні алгоритми, коли до неї на вхід подаватимуться змінні різних типів – використовуємо переобтяжені функції, якщо ж функція не дивлячись на те який тип змінної подається їй на вхід виконує один і той же алгоритм, то використовуємо функцію, що параметризується.

Ім’я класу
Поля
Методи

 

Охарактеризуйте принцип об’єктно-орієнтованого програмування – абстрагування. Дайте визначення інтерфейсу як елементу об’єктно-орієнтованих мов програмування. Як створити клас, що реалізує декілька інтерфейсів? Як на UML діаграмі класів відображаються інтерфейси?

Абстракция выделяет существенные характеристики некоторого объекта, отличающие его от всех других видов объектов и, таким образом, четко определяет его концептуальные границы с точки зрения наблюдателя.

Абстрагирование концентрирует внимание на внешних особенностях объекта и позволяет отделить самые существенные особенности поведения от несущественных. Назвали такое разделение смысла и реализации барьером абстракции, который основывается на принципе минимизации связей, когда интерфейс объекта содержит только существенные аспекты поведения и ничего больше. Мы считаем полезным еще один дополнительный принцип, называемый принципом наименьшего удивления, согласно которому абстракция должна охватывать все поведение объекта, но не больше и не меньше, и не привносить сюрпризов или побочных эффектов, лежащих вне ее сферы применимости.

Абстракция сущности Объект представляет собой полезную модель некой сущности в предметной области
Абстракция поведения Объект состоит из обобщенного множества операций
Абстракция виртуальной машины Объект группирует операции, которые либо вместе используются более высоким уровнем управления, либо сами используют некоторый набор операций более низкого уровня
Произвольная абстракция Объект включает в себя набор операций, не имеющих друг с другом ничего общего


Мы стараемся строить абстракции сущности, так как они прямо соответствуют сущностям предметной области.

Центральной идеей абстракции является понятие инварианта. Инвариант - это некоторое логическое условие, значение которого (истина или ложь) должно сохраняться. Для каждой операции объекта можно задать предусловия (инварианты предполагаемые операцией) и постусловия (инварианты, которым удовлетворяет операция). Изменение инварианта нарушает контракт, связанный с абстракцией. В частности, если нарушено предусловие, то клиент не соблюдает свои обязательства и сервер не может выполнить свою задачу правильно. Если же нарушено постусловие, то свои обязательства нарушил сервер, и клиент не может более ему доверять. В случае нарушения какого-либо условия возбуждается исключительная ситуация. Как мы увидим далее, некоторые языки имеют средства для работы с исключительными ситуациями: объекты могут возбуждать исключения, чтобы запретить дальнейшую обработку и предупредить о проблеме другие объекты, которые в свою очередь могут принять на себя перехват исключения и справиться с проблемой..

Идея контрактного программирования приводит нас к разграничению внешнего облика, то есть интерфейса, и внутреннего устройства класса, реализации. Главное в интерфейсе - объявление операций, поддерживаемых экземплярами класса. К нему можно добавить объявления других классов, переменных, констант и исключительных ситуаций, уточняющих абстракцию, которую класс должен выражать. Напротив, реализация класса никому, кроме него самого, не интересна. По большей части реализация состоит в определении операций, объявленных в интерфейсе класса.

Мы можем разделить интерфейс класса на три части:

· открытую (public) - видимую всем клиентам;

· защищенную (protected) - видимую самому классу, его подклассам и друзьям (friends);

· закрытую (private) - видимую только самому классу и его друзьям.

Квантор видимости может принимать одно из трех возможных значений и, соответственно, отображается при помощи специальных символов:

· Символ "+" обозначает атрибут с областью видимости типа общедоступный (public). Атрибут с этой областью видимости доступен или виден из любого другого класса пакета, в котором определена диаграмма.

· Символ "#" обозначает атрибут с областью видимости типа защищенный (protected). Атрибут с этой областью видимости недоступен или невиден для всех классов, за исключением подклассов данного класса.

· И, наконец, знак "-" обозначает атрибут с областью видимости типа закрытый (private). Атрибут с этой областью видимости недоступен или невиден для всех классов без исключения.

Охарактеризуйте поняття раннього та пізнього зв’язування методів. Для яких методів об’єкта застосовується раннє, а для яких пізнє зв’язування? Чим відрізняється виклик перекритих методів від виклику віртуальних(динамічних) методів? Чим відрізняється виклик віртуальних та динамічних методів між собою?

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

Різниця між заміщ. І статичн. Методами:

1)при описі у класі-предку ЗМ описуються директивою virtual або dynamic. У класі-нащадку – override.

2)ЗМ дають можливість об’єктам-батькам викликати методи об’єктів-нащадків.

Різниця між віртуальними та динамічними методами – в структурі відповідних даним методам таблиць. Для вірт. методів Форм-ся таблиця віртуальних методів. Така таблиця існує для кожного класу об’єктів. До неї заносяться адреси всіх віртуальних методів не залежно успадковані ці методи від предка чи перекриті. Кожному динамічному методу присвоюється унікальний індекс. В таблиці динамічних методів класу зберігаються індекси тільки тих методів, які описані у даному класі. Під час виклику динамічного методу відб-ся пошук в цій таблиці, в разі невдачі передивляються всі класи-предки за ієрархією. Виклик вірт методів відб-ся швидше, але потребує більше памяті.



Поделиться:


Последнее изменение этой страницы: 2021-12-07; просмотров: 120; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.134.118.95 (0.023 с.)