Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ООП_KAZYMYR.doc
Скачиваний:
14
Добавлен:
09.11.2019
Размер:
3.71 Mб
Скачать

4.3.2.Приведення типів

Інформація RTTI може використовуватися явно, наприклад, через покажчики на клас, або неявно через оператори is і as.

Оператор is (приналежність до класу) приймає true, якщо об'єкт (наприклад, anObj) сполучається по присвоюванню з типом (наприклад, TobjType) Дана перевірка здійснюється на етапі компіляції:

(аnObj is TObjType) = true;

(аnObj is TObjType) = false;

Оператор as – приведення типів. Вираз виду

with anObj as TObjType do

аналогічний

if anObj is TObjType then TObjType(anObj) do

Таким чином, as дозволяє провести перевірку сумісності на етапі виконання. У випадку порушення відповідності типів по присвоюванню породжується виняткова ситуація exception, що може бути оброблена за допомогою двох операторів: try…………finalyабо try ………… except... При використанні першого оператора виконання операцій, що йдуть за словом try відбувається в кожному разі, а другого – тільки у випадку виникнення виняткових ситуацій.

Після застосування оператора as сам об'єкт не змінюється, але звертатися до нього можна, тому що якби він належав до класу, до якого приводиться. Це особливо корисно в методах-оброблювачах подій (events) – дій, що вживають із ініціативи користувача або виникають при стандартних операціях з даними. Особливості методів-оброблювачів подій у тім, що вони мають як параметр змінну Sender типу Tobject:

procedure TForm1.OnClick(Sender: TObject);

begin

(Sender as TForm).Caption := 'Моя форма';

end;

У класу TObject немає властивості Caption, але воно є в класу Tform, тому якщо необхідно при обробці події OnClick змінити заголовок форми, то потрібно привести тип Sender до TForm.

4.4.Поліморфізм в Java

Особливості реалізації поліморфізму в Java полягають у наступному:

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

  1. Якщо в підкласі визначений однойменний метод з методом у суперкласі, то відбувається заміщення методу суперкласу. При необхідності заборонити заміщення методу необхідно оголосити його із ключовим словом final.

  2. Можуть бути оголошені абстрактні класи й методи, для яких не вказується реалізація. Абстрактні методи, як і абстрактні класи, оголошуються із ключовим словом abstract. Абстрактні класи можуть мати конструктори й деструктори, але явно їх викликати не можна. В абстрактних методах абстрактного класу можуть викликатися абстрактні методи цього ж класу.

  3. Деструктор суперкласу не повинен викликати абстрактний метод свого класу, тому що деструктор суперкласу викликається після деструктора підкласу.

4.5.Поліморфізм в SmallTalk

Особливості реалізації поліморфізма в SmallTalk полягають у наступному:

  1. Як і в Java, реалізується тільки пізніше зв'язування.

  1. Типи не підтримуються, тому будь-який змінної може бути привласнений екземпляр будь-якого класу.

  2. S mallTalk є мовою інтерпретуючого типу. Віртуальна машина (Virtual Machine) SmallTalk, що потрібно для виконання програм, написаних даною мовою, має структуру, наведену на рис. 4.7.

Рис. 4.7. Структура віртуальної машини SmallTalk

Компілятор транслює конструкцію вихідного коду мовою SmallTalk у послідовність байта-коду. Послідовність байтів-кодів методу є об'єктом класу CompiledMethod, що має структуру, показану на рис 4.8.

Екземпляр класу CompiledMethod заноситься в словник методів класу, що проглядається інтерпретатором. Інтерпретатор, зустрічаючи байт-код посланого повідомлення, виконує наступні дії:

Рис. 4.8. Структура об'єкта класу CompiledMethod

  1. Знаходить у стеку об'єкт-одержувач повідомлення.

  2. Шукає необхідний метод у словнику класу, до якого відноситься об'єкт-одержувач.

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

Т аким чином, схема виклику методу має вигляд, показаний на рис. 4.9.

Рис. 4.9. Схема виклику методів в SmallTalk

Контрольні питання:

  1. Навіщо потрібно віртуальне спадкування?

  1. Який механізм виклику віртуальних функцій у С++?

  2. Який вид зв'язування використовується в Java?

РОЗДІЛ 5 БІБЛІОТЕКА КЛАСІВ С++

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]