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



ЗНАЕТЕ ЛИ ВЫ?

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

Поиск

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

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

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

Інколи при використанні об’єктів всередині модулів можуть зустрічатися частини описів об’єктів, які експортувати небажано, наприклад, в комерційних застосунках. Необхідно передбачити об’єкти, методи яких доступні, але безпосередній доступ до даних об’єкта заборонений. В Pascal-і з цією метою використовуються приховані (приватні) поля і методи.

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

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

TYPE

NewObject=OBJECT(батьківський)

поля; [загальнодоступні];

методи; [загальнодоступні];

PRIVATE

поля; [приватні];

методи; [приватні];

PUBLIC

поля; [загальнодоступні];

методи; [загальнодоступні];

END;

 

 

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

Об’єднання в об’єкті коду та даних називається інкапсуляцією. При роботі з об’єктами необхідно створювати достатню кількість методів, які б забезпечували роботу з усіма полями даних, щоб не виникала необхідність звертатися до них безпосередньо. При цьому не обов’язково використовувати директиву PRIVATE, достатньо створити стільки методів, скільки необхідно для роботи з полями об’єкта.

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

Type

TStudent=OBJECT

  Name:String[30];

  Date:String[10];

  Rate:Real;

  Procedure Init(Nm,Dt:String; R t:Real);

  Function GetName:String;

  Function Get Date:String;

Function Get Rate: Real;

  Procedure ShowName;

  Procedure ShowDate;

  Procedure ShowRate;

END;

 

TStudent1=OBJECT(TStudent)

  Bal:Real;

  Procedure Init(Nm,Dt:String; R t,Bl:Real);

  Function Get Bal: Real;

  Function Get Sum: Real;

  Procedure ShowBal;

  Procedure ShowAll;

END;

Методи ShowName, ShowDate, ShowRate і ShowBal виводять прізвище, дату народження, розмір стипендії і середній бал відповідно. Метод Get Sum використовує Bal для розрахунку суми стипедії від середнього балу. Метод ShowAll виводить значення всіх полів одночасно.

Для екземпляру St1 типу TStudent 1 можна використовувати набір методів для непрямої роботи з полями даних, наприклад:

WITH St1 DO BEGIN

Init(‘Ляшук С.Т. ’,’10.02.1995’,700,4.5);

ShowAll;

END;

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

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

При використанні стандартних методів Pascal-ю дуже важко або й зовсім неможливо створювати гнучкі процедури, які б працювали з формальними параметрами змінних типів, як це робить, наприклад, процедура writeln, що може виводити на екран дані типу string, real, integer, boolean і споріднені з ними.

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

Пояснимо цей процес на прикладі. Попередньо ми створили два об’єктні типи:

  Type

TStudent=OBJECT

  Name:String[30];

  Date:String[10];

  Rate:Real;

  Procedure Init(Nm,Dt:String; R t:Real);

  Function GetName:String;

  Function Get Date:String;

Function Get Rate: Real;

  Procedure ShowName;

  Procedure ShowDate;

  Procedure ShowRate;

END;

 

TStudent1=OBJECT(TStudent)

  Bal:Real;

  Procedure Init(Nm,Dt:String; R t,Bl:Real);

  Function Get Bal: Real;

  Function Get Sum: Real;

  Procedure ShowBal;

  Procedure ShowAll;

END;

 

Дочірній тип успадковує від батьківського процедуру Init. Але, оскільки цей дочірній тип має додаткове поле даних Bal, яке батьківською процедурою Init не визначається, то цю процедуру необхідно перевизначити. Зробимо це так:

PROCEDURE TStudent1.Init(Nm,Dt:string;rt,bl:real);

Begin

TStudent.Init (Nm,Dt,Rt);

Bal:=bl;

End;

Зверніть увагу, що ми використовуємо метод ініціалізації об’єкту TStudent.  Синтаксис виклику успадкованого методу такий:

Предок.Метод;

де Предок – ідентифікатор батьківського типу, а Метод – ідентифікатор методу цього типу.

Відзначимо також, що перевизначати можна тільки методи, але в жодному випадку не поля даних.

 

Підсумок

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

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

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

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


 

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

1. Вибрати правильний запис, який би реалізував механізм успадковування

а) TStudent1=OBJECT:TStudent

  Bal:Real;

END;

б) TStudent1=OBJECT(TStudent)

  Bal:Real;

END;

в) TStudent1=OBJECT()

TStudent+Bal:Real;

END;

2. Нехай змінні a і b - об’єктного типу, причому a – дочірнього, b – батьківського. Який із записів правильний:

а) a:=b;

б) b:=a;

в) Обидві операції коректні

3. Яка директива вказує, що поля і методи, записані після неї, можуть використовуватися тільки в межах модуля?

а)PRIVATE

б)PUBLIC

в)CONSTRUCTOR

4. Як називається об’єднання в об’єкті коду та даних

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

 




Поделиться:


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

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