WITH Student DO BEGIN
Name:=’Лящук Петро Павлович’;
Date:=’25.06.1995’;
END;
Причому до полів можна звертатися не тільки тоді, коли вони напряму описані в даному типі, а й тоді, коли вони успадковуються від батьківського (породжуючого) типу (як проходить успадковування, буде показано пізніше).
До полів об’єкту можна звертатися безпосередньо, але краще цього уникати. Принципи ООП вимагають, щоб поля об’єктів були, наскільки це можливо, виключені з вихідного коду. Надалі буде показано, що поля методу можна оголосити прихованими, обмеживши можливість доступу до них межами модуля, в яких вони визначені.
Найраціональнішим способом одержання доступу до полів об’єкту у Pascal-і є використання методів самого об’єкта, при цьому метод є процедурою чи функцією, описаною всередині об’єкту, яка дозволяє зв’язуватися з ним.
Методи
Ініціалізація полів об’єкта
Звичайно при роботі з записами виникає проблема ініціалізації полів запису. Припустимо, наявна така структура
TStudent=OBJECT
Name:String[30];
Date:String[10];
Rate:Real;
END;
Початківці часто використовують оператор WITH для присвоєння полям Name, Date i Rate початкових значень
VAR
Student:TStudent;
…
WITH Student DO BEGIN
Name:=’Лящук Петро Павлович’;
Date:=’25.06.1995’;
Rate:=700;
END;
Такий метод буде коректним, але не ідеальним. Наприклад, при необхідності ініціалізувати більше одного запису типу TStudent доведеться використовувати кілька операторів WITH, які будуть виконувати одні і ті ж дії. Тому створимо ініціалізуючу процедуру, яка узагальнить застосування оператора WITH до будь-якого екземпляра типу TStudent, що передається в якості параметра.
Згідно з принципами ООП, включимо цю процедуру до складу об’єкту. Така процедура чи функція називається методом. В означення типу включається тільки заголовок методу. При визначенні методу він додатково ідентифікується іменем типу. Поля і методи є двома складовими частинами нової структури - об’єкта.
Type
TStudent=OBJECT
Name:String[30];
Date:String[10];
Rate:Real;
Procedure Init(Nm,Dt:String; RT:Real);
END;
Procedure TStudent.Init(Nm,Dt:String; RT:Real);
Begin
Name:=Nm;
Date:=Dt;
Rate:=Rt;
End;
Тепер для ініціалізації екземпляра типу TStudent достатньо просто викликати його метод
VAR
Student:TStudent;
Student.Init(‘Лящук Петро Павлович’,’25.06.1995’,700);
Визначення методів
Процес визначення методів об’єктів нагадує модулі Pascal-ю. Всередині об’єкту метод визначається заголовком процедури чи функції, яка діє як метод
Type
TStudent=OBJECT
Name:String[30];
Date:String[10];
Rate:Real;
Procedure Init(Nm,Dt:String; RT:Real);
Function GetName:String;
Function GetDate:String;
Function GetRate:Real;
END;
Зауважимо, що поля даних повинні бути оголошені перед оголошенням методу.
Подібно до інтерфейсної частини модуля, опис методів всередині об’єкту тільки називає дії, але не визначає, яким методом вони будуть виконуватися.
Самі методи описуються поза означенням об’єктів як окремі процедури чи функції. При визначенні методу перед його іменем пишеться ім’я типу об’єкту, якому належить цей метод, з наступною крапкою
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. Який параметр зв’язує об’єкт і його методи в одну область дій?
Лекція 4
Тема 2 Об’єктно-орієнтоване програмування в Pascal
Успадкування
Присвоювання об’єктів
Приховування даних в об’єктах
Інкапсуляція
Перевизначення методів
Підсумок
Питання по темі
Дата добавления: 2015-08-26; просмотров: 674;