Інформація про навчальний заклад

ВУЗ:
Національний університет Львівська політехніка
Інститут:
Не вказано
Факультет:
Не вказано
Кафедра:
Не вказано

Інформація про роботу

Рік:
2010
Тип роботи:
Лекція
Предмет:
Об’єктно-орієнтоване програмування

Частина тексту файла (без зображень, графіків і формул):

Міністерство освіти та науки України НУ „Львівська політехніка” Лекція №6 з курсу: «Застосування засобів об’єктно-орієнтованого програмування в лінгвістичних задачах» Львів - 2010 4.5. Типи методів1 1 Тейксейра, Стив, Пачеко, Ксавье. Borland Delphi 6. Руководство разработчика. Стр. 128 Методи об’єкта можуть бути описані як статичні (static), віртуальні (virtual), динамічні (dynamic) або як методи обрабки повідомлень (message). Розглянемо наступний приклад: TFoo = class procedure IAmAStatic; procedure IAmAVirtual; virtual; procedure IAmADynamic; dynamic; procedure IAmAMessage(var M: TMessage); message wm_SomeMessage; end; 4.5.1 Статичні методи Статичний метод (static) IAmAStatic працює так само як звичайна процедура або функція. Цей тип методів встановлюється за замовчуванням. Адреса такого методу відома вже на стадії компіляції, і компілятор в коді програми оформляє всі виклики даного методу як статичні. Такі методи працюють швидше інших, але не можуть бути перевантажені з метою поліморфізма об’єктів. 4.5.2 Віртуальні методи Метод IAmAVirtual оголошений як віртуальний (virtual). Виклик таких методів із_за можливості їх перевантаження складніший, чим виклик статичного методу, так як під час компіляції адреса конкретного метода що викликається не відомий. Для рішення цієї задачи компілятор будує таблицю віртуальних методів (VMT — Virtual Method Table), яка забезпечує визначення адреси метода в процесі виконання програми. VMT містить всі віртуальні методи пробатька і віртуальні методи самого об’єкта, тому віртуальні методи використовують більший об’єм пам’яті, чим методи динамічні, однак їх виклик відбувається швидше. 4.5.3 Динамічні методи Динамічні (dynamic) методи IAmADynamic в цілому подібні до віртуальних методів, але обслуговуються іншою диспетчерською системою. Кожному динамічному методу компілятор назначає унікальне число і використовує його разом з адресою метода для побудови таблиці динамічних методів (DMT — Dynamic Method Table). На відміну від VMT, DMT містить методи лише даного об’єкта, завдяки чому забезпечується економія пам’яті що використовується, але сповільнюється виклик методу, оскільки для пошуку його адреси, швидше всього, буде переглянута не одна DMT в ієрархії об’єктів. 4.5.4 Методи обробки повідомлень Методи обробки повідомлень (message_handling) IAmAMessage. Для оголошення методів обробки повідомлень викорисовується директива message, яка вказує компілятору, що даний метод є динамічним, і його зміщення в таблиці динамічних методів визначається ім’ям повідомлення, яке вказане після диретиви. Такі методи створюються для реакції на ті або інші повідомлень Windows. procedure WMHelp(var Message: ThelpMessage); message WM_HELP; Особливості оголошення методів обробки повідомлень: - в оголошенні МОП повинна використовуватися директива message; - безпосередньо за директивою message повинна бути вказана ціла константа, яка сприймається як динамічний індекс метода; - МОП можуть бути ппрочедурами; - МОП мають тільки один параматер, який повинен бути параметром- змінною; - ім’я метода, ідентифікатор і тип параметра МОП могуть бути довільними; - для перевизначення МОП використовується не директива override, а директива message з тим самим індексом, як і у попереднього метода. 4.5.5 Перевизначення методів Перевизначення (overriding) методів в Object Pascal реалізує концепцію поліморфізма. Це дозволяє змінити поведінку метода від спадкоємця до спадкоємця. Перевизначення метода можливо тільки в тому випадку, якщо спочатку він був оголошений як virtual або dynamic. Для перевизначення методу при його оголошення замість ключових слів virtual або dynamic необхідно вказати ключеве слово override. Розглянемо приклад перевизначення методів IAmAVirtual и IAmADynamic. TFooChild = class(TFoo) procedure IAmAVirtual; override; procedure IAmADynamic; override; procedure IAmAMessage(var M: TMessage); message wm_SomeMessage; end; Директива override приводить до заміщення стрічки опису похідного методу в VMT стрічкою опису нового методу. Якщо оголосити нові функції з ключевим словом virtual або dynamic, а не override, то замість заміщення старих будуть створенні нові методи. У випадку перевизначення статичного методу, новий варіант просто повністтю замінить статичний метод батька. 4.5.6 Перевантаження метода На зразок звичайним процедурам і функціям, методи можуть бути перевантажені таким чином, щоб клас містив декілько методів з одним ім’ям, але з різними списками параметрів. Методи що перевантажуються повинні бути оголошені з вказанням директиви overload (використовувати цю директиву при описі першого метода що перевантажується необов’язково). Наприклад оголошення об’єкта з методами що перевантажуються: type TSomeClass = class procedure AMethod(I: Integer); overload; procedure AMethod(S: string); overload; procedure AMethod(D: Double); overload; end; 4.5.7 Дублювання імен методів Іноді може знадобитися до одного з класів додати метод, що заміщає метод з тим самим ім’ям, але належить предку цього класу. В даному випадку треба не перевизначити похідний метод, а повністтю його замінити. Якщо просто додати такий метод в новий клас, то компілятор видасть попередження про те, що новий метод ховає метод базового класу з тим самим ім’ям. Для устранения цієї помилки в новому методі вкажіть директиву reintroduce: type TSomeBase = class procedure Cooper; end; TSomeClass = class procedure Cooper; reintroduce; end; 4.6. Контекст метода і параметр (Вказівник) Self У всіх методах об’єкта доступна неявна змінна Self, яка представляє собою вказівник на той екземпляр об’єкта, який був використаний при даному виклику цього методу. Змінна Self передає методу компілятором в якості схованого параметру. Код метода і поля даних об’єкта використовуються разом і мають один і той самий контекст. Параметр SELF практично є ідентифікатором, який належить методу об’єкта. type MouseStat = class Active : boolean; x, y : integer; LButton, RButton : boolean; visible : boolean; end; procedure Location.GotoMouse (MousePos : MouseStat); begin Hide; With MousePos do begin Self.x := x; Self.y := y; end; Show; end; Параметр Self є частиною фізичного запису активації для всіх викликів методів. 4.7. Поля даних об’єкта і формальні параметри методів. Як наслідок того що правила та їх об’єкти разом використовують один і той самий контекст є те, що формальні параметри правила не можуть бути ідентичні ні одному полю даних об’єкта. Ця умова аналогічна правилу, яка не дозволяє щоб формальні параметри процедури були ідентичні локальним параметрам процедури: Procedure CrunchIt (Crunchee : MyDataRec; Crunchby, ErrorCode : Integer); var A, B : char; ErrorCode : integer; (Це визначення викликає помилку) begin . . . Локальні змінні процедури і її формальні параметри разом використовують один і той самий контекст, а значить не можуть бути ідентичні. 4.8. Об’єкти що експортуються модулями. Об’єкти визначаються в модулях, причому тип об’єкта описується в інтефейсному розділі модуля, а тіло процедур методів типа об’єкта в розділі «реалізація». Модулі можуть мати свої власні визначення типу об’єкта в розділі реалізації, такі типи підпорядковуються тим самим обмеженням, що інші типи, які визначені в розділі реалізації модуля. Тип об’єкта, визначений в інтерфейсному розділі модуля, може мати похідні типи, що визначені в розділі цього модуля. В тому випадку, коли модуль В використовує модуль А, модуль В також може визначати похідні типи від будь якого типу об’єкта, що експортується модулем А (описаного в модулі А). Типи об’єктів і методи, можуть бути визначені в модулі наступним чином: Units Points; Interface Uses Graph; type Location = class X,y : integer; Procedure init( initX, InitY : integer); Function GetX : integer; Function GetY : integer; End; Point = class(Location) Visible : boolean; Procedure init(InitX, InitY : integer); Procedure Show; Procedure Hide; Function IsVisible : boolean; Procedure MoveTo(NewX, NewY : integer); End; Implementation { реалізація правил модуля Location} Procedure location.Init(IinitX, InitY : integer); begin X := InitX; Y := InitY; end; …. { Реалізація правил модуля Points } Procedure Point.Init(IinitX, InitY : integer); begin Location.Init(initX, InitY); Visible := False; end; Procedure Point.Show; Begin Visible := True; PutPixel(x,y, getcolor); End; Procedure Point.Hide; Begin Visible := False; PutPixel(x,y, getcolor); End; Function Point.Moveto(NewX, NewY : Integer); Begin Hide; X:=NewX; Y:=NewY; Show; End; End; Щоб використовувати типи об’єктів і методи, які визначені в модулі Point, ми використовуємо цей модуль у своїй програмі, і визначаємо екземпляр типа Point в розділі var своєї програми: Program MakePoints; Uses Graph, Points; Var APoint : Point; … Для того щоб створити и показати точку, нам необхідно викликати правило APoint, з використанням розділяючої точки: Apoint.Init(151, 82); Apoint.Show; ApointMoveto(163,101); Apoint.Hide; Об’єкти також можуть використовуватись в операторі with With Apoint do Begin Init(151,82); Show; MoveTo(163, 101); Hide; End; Так само як і записи, об’єкти можуть передаватися процедурам як параметри і можуть розподілятися в динамічній області. 4.9. Сумісність типів об’єктів. Похідний тип успадковує сумісність типів від прабітьківського типу. Ця розширена сумісність типів має три форми: 1. Між екземплярами об’єктів. 2. Між вказівниками на екземпляри об’єктів. 3. Між формальними і фактичними параметрами. У всіх трьох формах важливо пам’ятати, що сумісність типів розглядається тільки від нащадка до батьківського типу. Похідні типи можуть використовуватись замість пробатьківських типів, але не навпаки. Розглянемо наступне визначення: type LocationPrt = ^Location; PointPtr = ^Point; CirclePtr = ^Circle; end; var ALocation: Location; Apoint: Point; ACircle: Circle; PLocation: LocationPtr; PPoint: PointPrt; PCircle: CirclePrt; Для таких визначень будуть правильні наступні присвоєння. АLocation:= APoint; APoint:= ACircle; ALocation:= ACircle; Зворотні присвоєння недопустимі. Пробатьківському об’єкту може бути присвоєний екземпляр будь якого з його похідних типів. Похідні типи за допомогою спадкування містять визначення, що має їх пробатьківський тип. Таким чином похідний тип має такий самий розмір або більший, ніж його пробатьківський тип, але ніколи не меньше. Присвоєння пробатьківського об’єкта похідному об’єкту може привести до того, що деякі з полів нащадка можуть залишитись невизначеними що є недопустимо. В операторі присвоєння, тільки ті поля, які є спільними для обох типів, будуть скопійовані від джерела. В операторі присвоєння: ALocation:= ACircle; тільки поля Acircle X, Y будуть зкопійовані в ALocation, тому що тільки ці поля є спільними для типів Circle і Location. Сумісність типів також працює між вказівниками на типи об’єктів, виконуючи тіж самі правила що і для екземплярів типів об’єктів. Вказівники на нащадків можуть бути присвоєні вказівникам пробатьківського типу. Для даного визначення наступне присвоєння є допустиме: PPoint:= PCircle; PPLocation:= PPoint; PLocation:= PCircle; Необходимо пам’ятати, що зворотне присвоєння не допустимо. Формальний параметр(або величина, або var) даного типу об’єкта може брати в якості фактичного параметра свій власний об’єкт, або любий похідний тип. При даному заголовку процедури: Procedure DragIt (Target: Point); Фактичні параметри могуть бути параметрами типа Point або Circle, але не типа Location. Target може також бути параметром var, тут виконується тіж правила сумісності типів. Необхідно пам’ятати, що між параметром величини і параметром var є суттєва різниця. Var є вказівником на фактичний об’єкт, що передається як параметр. Це означає що фактичний параметр перевизначається в тип формального параметру. Аналогічно, якщо формальний параметр є вказівником на деякий тип об’єкта, то фактичний параметр може бути вказівником на цей тип об’єкта або вказівником на будь-який з похідних типів цьго об’єкта. При даному заголовку процедури: Procedure Figure.Add (NewFigure: PointPrt); Фактичні параметри могуть бути параметрами типа PointPtr або CirclePtr, але не типу LocationPtr. Питання: Література: 1. Архангельский А.Я. Программирование в Delphi. Учебник по классическим версиям Delphi. 2006 г. - 1152 с. 2. Архангельский А.Я. Delphi 2006. Справочное пособие: язык Delphi, классы, функции Win32 и .NET, 2006 г. - 1152 с. 3. Архангельский А.Я. Приемы программирования в Delphi на основе VCL, 2006 г. - 944 с. 4. Архангельский А.Я. Программирование в Delphi для Windows. Версии 2006, 2007, Turbo Delphi, 2007 г. - 1248 с. 5. Гофман В. Э., Хомоненко А. Д. Delphi. Быстрый старт. — СПб.: БХВ-Петербург, 2003. — 288 с: ил. 6. Шупрута В.В. Delphi 2005. Учимся програмировать. 7. Тейксейра Стив, Пачеко Ксавье. Borland Delphi 6. Руководство разработчика.
Антиботан аватар за замовчуванням

17.02.2013 23:02-

Коментарі

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

Ділись своїми роботами та отримуй миттєві бонуси!

Маєш корисні навчальні матеріали, які припадають пилом на твоєму комп'ютері? Розрахункові, лабораторні, практичні чи контрольні роботи — завантажуй їх прямо зараз і одразу отримуй бали на свій рахунок! Заархівуй всі файли в один .zip (до 100 МБ) або завантажуй кожен файл окремо. Внесок у спільноту – це легкий спосіб допомогти іншим та отримати додаткові можливості на сайті. Твої старі роботи можуть приносити тобі нові нагороди!
Нічого не вибрано
0%

Оголошення від адміністратора

Антиботан аватар за замовчуванням

Подякувати Студентському архіву довільною сумою

Admin

26.02.2023 12:38

Дякуємо, що користуєтесь нашим архівом!