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



ЗНАЕТЕ ЛИ ВЫ?

Procedure TStudent.Init(Nm,Dt:String; RT:Real);

Поиск

Begin

Name:=Nm;

Date:=Dt;

Rate:=Rt;

End;

 

Function TStudent.GetName:String;

Begin

GetName:=Name;

End;

Function TStudent.GetDate:String;

Begin

GetDate:=Date;

End;

Function TStudent.GetRate:String;

Begin

GetRate:=Rate;

End;

 

Всередині визначення методу його ім’я вже не зв’язується з типом TStudent.

 

Область дії методів і параметр Self

Зауважмо, що в жодному з попередніх прикладів конструкція

WITH обєкт DO …;

не зустрічається у явному вигляді. Поля даних об’єкта легко доступні за допомогою методів об’єкта. Хоча у вихідному коді поля даних об’єкта і тіла методів розділені, насправді вони сумісно використовують ту саму область дій. Саме тому один з методів TStudent може містити оператор

GetRate:= Rate;

без жодного кваліфікатора перед Rate. Можна сказати, що всередині методів об’єкта діє неявний оператор WITH. Наслідком цього є те, що формальні параметри методу, якщо такі є, не можуть співпадати за іменем ні з одним полем відповідного об’єкта.

Якщо об’єкт викликає метод, то виконується неявний оператор:

WITH Self DO метод;

що зв’язує об’єкт і його методи в одну область дій.

Неявний оператор WITH виконується шляхом передачі невидимого параметра методу кожного разу, коли цей метод викликається. Цей параметр називається Self і насправді він є 32-розрядним вказівником на екземпляр об’єкту, що здійснює виклик методу. Метод GetName, що стосується типу TStudent, приблизно еквівалентний опису

Procedure TStudent. GetName: String;

Begin

GetName:=Self.Name;

End;

хоча такий опис не зовсім коректний. Фактично, параметр Self є начебто невидимим полем об’єкту типу TStudent (чи будь-якого іншого об’єктного типу), доступ до якого здійснюється так само, як і до будь-якого іншого поля об’єкта.

Звичайно нема необхідності у використанні цього параметра, оскільки генерований Pascal-ем код обробляє його автоматично. Однак у деяких ситуаціях, коли, наприклад, об’єкти різних типів мають поля зі співпадаючими іменами або треба звернутися до об’єкту в цілому (взяти його адресу, порівняти його з іншим об’єктом цього ж типу), можна використовувати параметр Self явно. (Ми це будемо робити в Лабораторній роботі 1-2).

 

Підсумок

Об’єкт у розумінні мови Pascal – це така структура, компонентами якої є взаємозв’язані дані різних типів і процедури та функції, що ці дані використовують. Компоненти-дані називаються полями об’єкта, а компоненти-процедури і функції називаються методами. Поля даних повинні бути оголошені перед оголошенням методу. Якщо об’єкт викликає метод, то виконується неявний оператор:

WITH Self DO метод;

що дає змогу звертатися до полів об’єкта без додаткових кваліфікаторів.

 

Питання по темі

1. Компоненти-дані називаються ________ об’єкта, а компоненти-процедури і функції називаються _____________

2. Назвати ключове слово для позначення типу «об’єкт»

3. Як у загальному випадку звертатися до полів об’єкта?

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

5. Який параметр зв’язує об’єкт і його методи в одну область дій?

 

 


 Тема 2 Об’єктно-орієнтоване програмування в Pascal. Успадковування. Інкапсуляція

 

Успадкування

Присвоювання об’єктів

Приховування даних в об’єктах

Інкапсуляція

Перевизначення методів

Підсумок

Питання по темі

 

Успадкування

Припустимо, що перед нами поставили таке завдання: доповнити частину об’єктів типу TStudent полем даних Bal дійсного типу. В цьому полі будемо записувати середню оцінку студента згідно з результатами останньої сесії. Таку оцінку мають тідьки студенти, які провчилися в навчальному закладі не менше семестра, вона відсутня у студентів, які щойно були зараховані.

Назвемо новий тип TStudent1. Звичайно, ми могли б визначити його, просто продублювавши відповідний опис типу TStudent і додавши нове поле даних. Вийшло б щось таке:

TStudent1 =OBJECT

  Name:String[30];

  Date:String[10];

  Rate:Real;

  Bal: Real;

END;

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

TStudent1= OBJECT(TStudent)

  Bal: Real;

END;

Тип TStudent називається батьківським (parent), тип TStudent1 – дочірнім (child). Фактично цей процес можна продовжувати як завгодно довго: можемо визначити наступний тип, для якого TStudent1 буде батьківським. Найчастіше побудова об’єктно-орієнтованих прикладних програм полягає в побудові такої ієрархії об’єктів.

Всі типи, які успадковують тип TStudent, називаються його дочірніми типами, але TStudent1 є безпосереднім дочірнім типом від TStudent, а TStudent є безпосереднім породжуючим типом для TStudent1.

 

Присвоювання об’єктів

З уміння об’єктів успадковувати випливають нові правила присвоювання для змінних типу «об’єкт» (екземплярів). Їм можна присвоювати не тільки значення цього ж типу, але й будь-якого похідного від них. Аналогічне правило сумісності типів діє при передачі в процедуру чи функцію параметрів типу «об’єкт». Наприклад, якщо у програмі оголошені змінні типу «об’єкт»

VAR

St: Tstudent;

St 1: Tstudent 1;

то для копіювання значення, записаного у змінній St1, у змінну St2 достатньо виконати присвоювання

St:= St1;

Подібна операція заповнить поля даних у St значеннями аналогічних полів, успадкованих St1 (тобто полів Name, Date, Rate). Методи таким способом не присвоюються. Оскільки похідний тип завжди має не менше полів даних, ніж прабатьківський, операція можлива саме у такий спосіб:

Прабатько:=Спадкоємець;

При цьому гарантується заповнення всіх полів змінної, що стоїть зліва. Інакше виникла б невизначеність із «зайвими» полями, присутніми у правій змінній. Щоб уникнути такої невизначеності, забороно ставити «породжений» тип зліва від прабатьківського.

Змінні типу «об’єкт» можуть бути динамічними, тобто оголошуватися як вказівники.

VAR

Dyn_ St: ^ TStudent;

Dyn_ St 1: ^ TStudent 1;

Після створення динамічних об’єктів процедурою чи функцією New вказівники (як розіменовані, так і самі по собі) можуть присвоюватися один одному. Правила сумісності залишаються тими ж: коректними будуть лише присвоювання вказівників на спадкоємців вказівникам на прабатьків.

Dyn_ St: = Dyn_ St1;

Dyn_ St ^: = Dyn_ St 1^;

Подібні правила діють і по відношенню до формальних-фактичних параметрів: формальний параметр даного об’єктного типу може приймати в якості фактичного параметра об’єкт свого ж типу чи об’єкти всіх дочірніх типів. Якщо визначити заголовок процедури так:

Procedure Show_ Fields(Obj: TStudent);

то допустимими типами фактичних параметрів можуть бути TStudent i TStudent1.

А в такому випадку

Procedure Show_ Fields(Obj: TStudent1);

допустимий тип фактичних параметрів лише TStudent1.



Поделиться:


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

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