Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
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 с.) |