АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

КЛЮЧОВЕ СЛОВО INHERITED ______________________________________________________

Читайте также:
  1. A formula - formulae (formulas), a crisis - crises, a criterion - criteria, an index - indices, a bacterium — bacteria, an axis — axes
  2. A global effort to keep food prices from soaring higher
  3. A radioactive disintegration. Kinds of radioactive radiation
  4. A REVIEW OF THE FOOD AND BEVERAGE MARKET IN KAZAKHSTAN
  5. A) Listen to the recording of Text Five and mark the stresses and tunes, b) Repeat the text in the intervals after the model.
  6. A) Listen to the recording of Text Four and mark the stresses and tunes, b) Repeat the text in the intervals after the model.
  7. A) Listen to the recording of Text One and mark the stresses and tunes, b) Repeat the text in the intervals after the model.
  8. A) Listen to the recording of Text Six and mark the stresses and tunes, b) Repeat the text in the intervals after the model.
  9. A) Listen to the recording of Text Two and mark the stresses and tunes, b) Repeat the text in the intervals after the model.
  10. A) Make a round-table talk on the state of film-making in this country. Be ready to make suggestions about the possible improvements in film-making.
  11. A) Read the following extract from an essay by V. Belinsky and summarize it in English.
  12. A) Read the following text dealing with comprehension of literature on school level.

 

В попередньому прикладі ми використовували виклик предківського методу шляхом вказання імені предка, після якого пишеться крапка та ім’я конструктора.

constructor TStudent1.init(nm,dt:string;rt,bl:real);

Begin

IF NOT TStudent.Init(nm,dt,rt) THEN Failed;

bal:=bl;

end;

Pascal дає можливість використовувати спеціальне слово INHERITED, використовуючи яке можна викликати методи предка без вказання імені предка.

constructor TStudent1.init(nm,dt:string;rt,bl:real);

Begin

IF NOT INHERITED Init(nm,dt,rt) THEN Failed;

bal:=bl;

end;

Це може виявитися корисним при використанні великої ієрархії об’єктів, коли складно запам’ятати всі зв’язки типу «предок-потомок».

ВИДАЛЕННЯ ДИНАМІЧНИХ ОБ’ЄКТІВ. ______________________________________________

Динамічними можуть бути об'єкти із статичними і віртуальними методами. Видалення динамічних об'єктів може бути за допомогою процедур Dispose або за допомогою деструктора.

Синтаксис виклику процедури Dispose такий:

Dispose (<ідентифікатор вказівника>);

Подібно до інших динамічних типів даних динамічні об'єкти із статичними методами можуть видалятися за допомогою Dispose.

Наприклад: Dispose (P1);

Приклад програми з динамічним об'єктом із статичними методами даний в лістингу 1.

Для звільнення ОП динамічних об'єктів з віртуальними методами використовуються особливі методи - деструктори. В якості їх імені рекомендується вживати ім'я Done. Вони призначені для виконання завершуючих дій програми. Деструктори розміщуються разом з іншими методами об'єкту у визначенні типу і оформляється так само, як звичайний метод-процедура, але слово PROCEDURE замінюється словом DESTRUCTOR.

Наприклад: Destructor Tobjl.Done;

Виклик деструкції (Done) поза процедурою Dispose не приведе до автоматичного звільнення ОП, займаною екземпляром об'єкту, тобто неприпустимо Р1^.Done;.

Для коректного звільнення ОП, яку реально займає екземпляр динамічного об'єкту з пізнім скріпленням, деструкцію треба викликати за допомогою розширеного типу процедури Dispose.

Він має 2 параметри: ім'я покажчика на об'єкт і ім'я деструкції.

Наприклад: Dispose (P1,done);

де Done - ім'я деструкції об'єкту, на який указує Р1.

Деструктор об’єднує етап видалення об’єкту з іншими діями чи задачами, необхідними для даного типу об’єкту. Для одного типу об’єкту можна визначити кілька деструкторів.

Type

TStudent=object

Name:String[30];

Date:string[10];

rate:real;

constructor init(nm,Dt:String;rt:real);

destructor done; virtual;

function GetName:string; virtual;

function getdate:string;

function getrate:real;

procedure showname;

procedure showdate;

procedure showrate;

end;

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

Деструкція виконується як звичайний метод. Коли буде виконано останню його дію, якщо об'єкт містить віртуальні методи, то деструктор проводить пошук розміру об'єкту в ТВМ і передає його процедурі Dispose, яка і звільняє правильну кількість байт, незалежно від того, чи вказував Р1 на тип предка або нащадка.
     

Метод деструкції може бути і порожнім, оскільки основна інформація міститься не в тілі деструкції, а пов'язана з його заголовком, що містить слово Destructor.

Деструктор нащадка останньою своєю дією повинен викликати відповідну деструкцію свого безпосереднього предка, щоб звільнити ОП всіх успадкованих вказівників об'єкту.

Наприклад:

Destructor Tobj1.Done;

Begin

... INHERITED Done;

End;

Для коректного звільнення ОП при використанні поліморфних об'єктів також треба використовувати процедуру Dispose розширеного вигляду.

Поліморфним є об'єкт, значенням якого можуть бути екземпляри різних (таких же або породжених) типів. Ці правила відносяться і до вказівників на об'єкти: об'єкт, що адресується ними, також буде поліморфним.

Термін "поліморфний" означає, що компілятор, будуючи код об'єкту, під час компіляції, "не знає", який тип об'єкту буде насправді використаний. Єдине, що він "знає", - це те, що об'єкт належить ієрархії об'єктів, що є нащадками вказаного типу предка. Розміри різних об'єктів ієрархії можуть бути різні. Інформація про розмір об'єкту, що видаляється, стає доступною, для деструкції з ТВМ у момент видалення екземпляра об'єкту. ТВМ будь-якого об'єкту доступна через параметр Self, що містить адресу ТВМ, яка передається деструкції при його виклику.

Деструкція може об'єднувати видалення об'єкту з іншими діями, необхідними для коректного видалення. Наприклад, при видаленні динамічного об'єкту може знадобитися не тільки звільнення займаною ним ОП. Об'єкт може містити вказівник на динамічні об'єкти або зв'язані структури (стеки, черги, списки), які треба видалити в певному порядку. Всі операції для видалення динамічного об'єкту повинні об'єднуватися в один метод, щоб об'єкт міг бути знищений за допомогою одного виклику. Наприклад: Objl.Done; або Dispose (Pi, Done); Для одного і того ж типу об'єкту може бути декілька деструкцій. Деструкції можна успадковувати. Вони можуть бути статичними або віртуальними. Наприклад: Destructor Done; Virtual; Для динамічних об'єктів доцільно оголошувати віртуальну деструкцію, навіть якщо об'єкт не містить інших віртуальних методів. Якщо деструкція віртуальна, зв'язок з конкретним екземпляром об'єкту здійснюється в процесі виконання програми. Отже, залежно від типу екземпляра об'єкту деструкція звертатиметься до ТВМ-предка або до ТВМ-потомка ієрархії об'єктів. Розміри що виділяється для них ОП можуть бути різними. При цьому для кожного типу об'єкту виконується деструкція, відповідна даному типу об'єкту. Деструктори працюють з динамічними об'єктами. Але застосування деструкторів до статичних об'єктів не є помилкою і не приведе до некоректної роботи програми.
     

Процедура FreeMem звільняє пам'ять, адресовану вказівником, який є парамет­ром процедури. Обсяг пам'яті, що звільняється, зазначається як другий параметр процедури FreeMem.

Наведемо синтаксис виклику процедури:

FreeMem(<ідентифікатор вказівника>,<обсяг пам'яті>);
Слід пам'ятати, що розподіл динамічної пам'яті за допомогою процедури GetMem потребує її звільнення за допомогою процедури FreeMem. Під час застосування цих процедур до одного й того самого вказівника значення параметрів, що задають обсяг динамічної пам'яті, мають збігатися.
     

У результаті багатьох викликів процедур New і Dispose, а також GetMem і FreeMem динамічна пам'ять фрагментується. В ній з'являються несуміжні вільні ділянки. Щоб мати можливість звільняти динамічну пам'ять, використовуються процеду­ри Mark і Release.

Синтаксис виклику цих процедур такий:

Mark(<ідентифікатор вказівника>); Release(<ідентифікатор вказівника>);

Процедура Mark запам'ятовує поточне значення вказівника HeapPtr у вказівнику, що є параметром процедури.

Нагадаємо, що вказівник HeapPtr містить адресу по­чатку вільної динамічної пам'яті.
     

Процедура Release звільняє динамічну пам'ять, починаючи від комірки, що адресується параметром процедури, до кінця динаміч­ної пам'яті. Один виклик процедури Release знищує список усіх вільних фрагмен­тів у динамічній пам'яті, створених викликами процедури Dispose, а також усі дина­мічні змінні, створені після виклику процедури Mark.

Використовувати два різні механізми звільнення динамічної пам'яті (за допомогою процедур Dіspose і Release) в межах однієї програми небажано, оскільки доведеться стежити за тим, щоб про­цедура Dispose не звільняла змінні, що вже були звільнені процедурою Release.
     

Constructor - для віртуальних методів, для створення ТВМ при використанні статичних і динамічних об'єктів.

Destructor - для звільнення ОП динамічних об'єктів, що містять віртуальні методи.

Лістинг 1. Динамічні об'єкти із статичними методами.

Program novirt;

Uses Crt; { Оголошення: }

Type Objname1 = object { - об'єкту-предка }

Fl1: integer;

Procedure Met1;

Procedure Met2;

End;

Objname2 = object (Objname1) { - об'єкту-нащадка }

Procedure Met2; End;

Pobjname1 = ^ObjName1; {- тип - покажчик на об'єкт Objname1 }

Pobjname2 = ^ObjName2; { - " " " " Objname2 }

{ ----------------------------- Методи об'єкту Objname1-------------------------- }

Procedure Objname1.Met1;

Begin

Met2; { - виклик тільки методу Objname1.Met2!!}

End;

Procedure Objname1.Met2;

Begin

Fl1:= 12;

Writeln ('Працює метод Objname1.Met2: Fl1 = ', Fl1)

End;

{----------------------- Методи об'єкту Objname2-----------------------------------}

Procedure Objname2.Met2;

Begin

Fl1:= 34;

Writeln ('Працює метод Objname2.Met2: Fl1 = ', Fl1)

End;

Var V1: Pobjname1; { - динамічний об'єкт V1 }

V2: Pobjname2; { - " " V2 }

{------------------------------ Основна програма -----------------------------------}

Begin

Clrscr;

Assign (Output, 'dnovirt.res'); Rewrite (output);

Writeln ('ДИНАМІЧНІ ОБ'ЄКТИ, СТАТИЧНІ МЕТОДИ');

Writeln ('Працюємо з VI - екземпляром типу предка');

New (V1); { - створення динамічного об'єкту V1 }

V1^.Met1; { - виклик методу Objname1.Met1; }

Vl1.Met2; { - " " Objname1.Met2; }

Dispose (V1); { - видалення об'єкту V1 }

Writeln ('Працюємо з V2 - екземпляром типу нащадка');

New (V2); { - створення динамічного об'єкту V2 }

V2^.Met1; { - викликає ЗАВЖДИ метод Objname1.Met2, а не Objname2.Met2 }

V2^.Met2; { - виклик методу Objname2.Met2; }

Dispose (V2); { - видалення об'єкту V2 }

Close (Output);

End.


1 | 2 | 3 | 4 |

Поиск по сайту:



Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.011 сек.)