рефераты конспекты курсовые дипломные лекции шпоры

Реферат Курсовая Конспект

Type имя типа=Object

Type имя типа=Object - раздел Транспорт, От автора Описание Полей Описание Методов End; Поля Об...

описание полей описание методов End;

Поля объектов описываются так же, как поля записей, а описание метода - это заголовок процедуры или функции. Сами методы располагаются в программе после описания объектного типа. В заголовке процедуры или функции указывается ее составное имя: имя типа.имя метода. Все поля объекта непосредственно доступны в каждом из его методов, их не нужно передавать через список параметров, это свойство объектов называется инкапсуляция. В программе можно описать любое количество переменных объектного типа. Объектом принято называть объектный тип, а переменную такого типа - экземпляром объекта. Структура объекта похожа на структуру записи, и для обращения к полям и методам объектов также используется либо составное имя

имя экземпляра объекта .имя поля/метода

либо оператор присоединенияWith имя экземпляра объекта, внутри которого можно записывать простые имена полей и методов. Экземпляры одного и того же объекта можно присваивать друг другу. Приведем тривиальный пример объекта.

Type ObjT1=Object {этот объект может вычислять xn}

x : Real;

n : Word;

Function Power:Real;

{методу не нужно передавать x и n, он “знает” их согласно свойству инкапсуляции}

End;

Function ObjT1.Power:Real;{здесь необходимо указать составное имя метода}

Var

i : Word;

p : Real;

Begin

p:=1;

For i:=1 To n Do p:=p*x;

Power:=p;

End;

 

Var O1_1,O1_2 : ObjT1; {два экземпляра объекта ObjT1}

Begin

With O1_1 Do Begin x:=2; n:=4; End;

{использовали оператор присоединения}

O1_2 .x:=3; O1_2 .n:=3; {использовали полные имена полей}

WriteLn(O1_2.Power-O1_1.Power:4:1);

End.

 

Программа выведет: 11.0

Другим важным свойством объектов является свойство наследования. Объект может быть объявлен потомком ранее описанного объекта и унаследовать от объекта-родителя все его поля и методы. Объект-потомок может также иметь собственные поля и методы, которых не было у объекта-родителя. Объект-потомок описывается так:

Object(имя родителя)

описание новых полей

описание новых методов

End;

Экземпляру объекта-родителя можно присваивать экземпляр объекта-потомка, но не наоборот. Запишем пример наследования:

 

Type

ObjT1=...;

ObjT2= Object(ObjT1) {этот объект может вычислять xn и xy}

y:Real;

Function RealPower:Real;

End;

ObjT3=Object(ObjT2) {этот объект может вычислять xn , xy и 10y}

Function Power10:Real;

End;

Function ObjT1.Power...;

Function ObjT2.RealPower:Real; Begin RealPower:=Exp(y*Ln(x)); End;

Function ObjT3.Power10:Real; Begin Power10:=Exp(y*Ln(10)); End;

Var

O1 : Objt1;

O2 : ObjT2;

O3 : ObjT3;

Begin

With O3 Do Begin

x:=2;

y:=1/3;

n:=5;

End;

O2:=O3; {родителю присвоили потомка}

O1:=O3;

WriteLn(O3.Power10-O2.RealPower+O1.Power:7:4);

End.

 

Программа выведет: 32.8945 = 101/3-21/3+25 .

Объект-потомок может заменять методы объекта-родителя на собственные методы с теми же именами. Это свойство объектов называется полиморфизмом. Приведем простой пример полиморфизма.

 

Type

ObjT1=...;

ObjT2=...;

ObjT3=...;

ObjT4=Object(ObjT3) {этот объект вместо xn вычисляет xt}

Function Power(t:Integer):Real;

End;

Function ObjT1.Power...

Function ObjT2.RealPower...

Function ObjT3.Power10...

Function ObjT4.Power(t:Integer):Real;

Var

i : Word;

p : Real;

Begin

p:=1;

For i:=1 To ABS(t) Do p:=p*x;

If t<0 Then Power:=1/p Else Power:=p;

End;

Var O4 : ObjT4;

Begin

O4.x:=2;

With O4 Do WriteLn(Power(2)-Power(-2):5:2);

End.

 

Программа выведет: 3.75 = 22-2-2. Однако замененные в объекте-потомке родительские методы остаются доступными; чтобы обратиться к ним внутри любого метода потомка, используется ключевое слово Inherited (унаследованный). Перепишем метод Power объекта ObjT4, пользуясь этой возможностью:

 

Function ObjT4.Power(t:Integer):Real;

Begin

If t>=0 Then Begin

n:=t;

Power:=Inherited Power;

End

Else Begin

n:=-t;

Power:=1/Inherited Power;

End;

End;

 

Некоторые методы объекта могут быть виртуальными. При описании таких методов в объекте после заголовка процедуры или функции записывается конструкция Virtual; Объект, содержащий хотя бы один виртуальный метод, должен иметь и специальный метод - конструктор. Конструктор полностью тождествен процедуре, но слово Procedure в нем заменяется на слово Constructor. Виртуальные методы присоединяются к объекту не на этапе компиляции, а только при вызове конструктора (при этом содержимое конструктора не имеет никакого значения, он может быть и пустым). Конструкторы не могут быть виртуальными. Невиртуальные методы называются статическими. Объекты-потомки могут заменять родительские виртуальные методы только виртуальными, а родительские статические методы - только статическими. Если объект-потомок заменяет родительский виртуальный метод своим, то у нового метода должен быть точно такой же список параметров, как и у родительского. На статические методы это правило не распространяется. Приведем очень простой пример, иллюстрирующий различие между статическими и виртуальными методами.

 

Type

TA = Object

Procedure Out;

Function Message:String;

End;

TB = Object(TA)

Function Message:String;

End;

Procedure TA.Out; Begin WriteLn(Message); End;

Function TA.Message:String; Begin Message:='TA'; End;

Function TB.Message:String; Begin Message:='TB'; End;

Var

A :TA;

B :TB;

Begin

A.Out;

B.Out;

WriteLn(B.Message);

End.

 

Программа выведет: TA TA TB. Метод Out родительского объекта TA собирается полностью; в частности, к нему подключается метод Message объекта TA. Замена метода Messageв объекте TB уже никак не может повлиять на унаследованный этим объектом статический метод Out. Теперь сделаем метод Message виртуальным.

 

Type

TA= Object

Procedure Out;

Function Message:String; Virtual;

Constructor Init;

{конструктор должен быть, так как есть виртуальный метод}

End;

TB= Object(TA)

Function Message:String; Virtual;

Constructor Init;

End;

Procedure TA.Out; Begin WriteLn(Message); End;

Function TA.Message:String; Begin Message:='TA'; End;

Function TB.Message:String; Begin Message:='TB'; End;

Constructor TA.Init; Begin End; {оба конструктора пустые}

Constructor TB.Init; Begin End;

Var

A : TA;

B : TB;

Begin

A.Init;

A.Out;

B.Init;

B.Out;

End.

Программа выведет: TA TB. МетодMessage является виртуальным, это значит, что компилятор не подключает этот метод к процедуре Outдо выполнения конструктора. Какая именно функция будет использоваться в качестве метода Messageпосле компиляции, еще не известно. Выполнение оператора A.Init приводит к подстановке вместо неопределенного виртуального метода Message конкретной функции TA.Message. Если виртуальных методов в объекте несколько, эта операция выполняется для каждого из них при вызове конструктора. Аналогично при вызове B.Init виртуальный метод Message в экземпляре объекта B будет заменен на функцию TB.Message всюду, где этот метод используется, в том числе и внутри метода Out. Использование в объектах виртуальных методов предполагает, что потомки данного объекта будут изменять эти методы. Если изменение метода не ожидается, то он объявляется статическим.

Экземпляры объектов можно размещать в динамической памяти. Для этого используется либо процедура New:

New(указатель на объект[,конструктор]);

либо функция New:

указатель на объект:=New(тип объекта [,конструктор]);

Конструктор обязательно указывается для объектов, имеющих виртуальные методы, и задается своим простым именем. В динамически размещаемых объектах можно использовать специальный метод-деструктор. Деструктор - это процедура, в которой ключевое слово Procedure заменяется словом Destructor. Динамически размещенный объект уничтожается процедурой

Dispose(<указатель на объект>[,<деструктор>]);

В деструкторе можно предусмотреть все необходимые действия по очистке памяти. Приведем пример объекта, размещаемого в динамической памяти:

 

Type

MType=Array[1..100] Of Word;

MPtrType=^MType;

ObjType = Object

n:Byte;

p:MPtrType;

Procedure Fill; Virtual;

Procedure Out; Virtual;

Constructor Make;

Destructor Crush;

End;

PObjType = ^ObjType;

Procedure ObjType.Fill;

Var i:Byte;

Begin

For i:=1 To n Do p^[i]:=Random(100);

End;

Procedure ObjType.Out;

Var i:Byte;

Begin

For i:=1 To n Do Write(p^[i]:4);

WriteLn;

End;

Constructor ObjType.Make; Begin New(p); End;

Destructor ObjType.Crush; Begin Dispose(p); End;

 

Var X,Y : PObjType;

Begin

X:=New(PObjType,Make); {обращаемся к New как к функции, конструктор вызывается автоматически}

With X^ DO Begin

n:=40;

Fill;

Out;

End;

New(Y); {обращаемся к New как к процедуре}

With Y^ Do Begin

Make; {конструктор вызываем “вручную”}

n:=20;

Fill;

Out;

Crush; {деструктор вызываем “вручную”}

End;

Dispose(X,Crush); {деструктор вызывается автоматически}

Dispose(Y);

End.

– Конец работы –

Эта тема принадлежит разделу:

От автора

B r... Теперь мы можем присвоить переменным их значения...

Если Вам нужно дополнительный материал на эту тему, или Вы не нашли то, что искали, рекомендуем воспользоваться поиском по нашей базе работ: Type имя типа=Object

Что будем делать с полученным материалом:

Если этот материал оказался полезным ля Вас, Вы можете сохранить его на свою страничку в социальных сетях:

Все темы данного раздела:

От автора
Первое издание этой книги вышло в свет в 1997 году и довольно быстро стало библиографической редкостью. Автор несколько неожиданно для себя обнаружил, что книга пользуется черезвычайно высоким спро

Round(x) - округленное до целого вещественное число, преобразованное к типуLongInt
6. Sqr(x) - квадрат числа 7. Sqrt(x) - квадратный корень 8. Exp(x) - экспонента 9. Ln

Символьный тип данных
Для хранения символьной информации в Паскале предусмотрен специальный тип данных Char. Допустимы переменные, нетипизированные и типизированные константы такого типа. Данные типа

Caseвыражение Of
список значений : оператор/блок .................................. список значений: оператор/блок

Процедуры и функции. Сфера действия описаний
В языке Паскаль (как вы уже поняли из предыдущего материала) существуют понятия процедуры и функции. Процедуры и функции можно определить как замкнут

Открытые массивы и нетипизированные параметры
Из предыдущего раздела мы узнали, что параметры подпрограмм описываются как [Var] имя : имя типа , это правда, но не вся правда - существует еще два

Множества
Понятие множества в Паскале очень близко к математическому определению: множество - это совокупность однотипных неиндексированных объектов. Множества

Графические средства языка Паскаль
Монитор персонального компьютера может работать в двух режимах - текстовом и графическом. Все, что мы делали до сих пор, мы делали в текстовом режиме. Текстовый экран содержит 2000 знако

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

Case тип Of
константа 1 : (описание поля); константа 2 : (описание поля); .....................

Модуль Crt
Crt - еще один стандартный модуль Паскаля, в котором содержатся разнообразные средства консольного ввода-вывода (то есть ввода с клавиатуры и вывода на текстовый экран). Процедуры

Var TextAttr : Byte
В ней содержится текущий цвет фона и цвет символов, используемые при выводе на экран процедурами Write иWriteLn. Изменив эту переменную, вы задаете новый

Другие средства обработки файлов и модуль DOS
Для того чтобы определить, есть ли на диске файл с заданным именем, удобно использовать уже известную нам стандартную функцию IOResult , которая возвращает ноль при успешном завершении последней оп

Type SearchRec=Record
Fill : Array[1..21] of Byte; Attr : Byte; Time : LongInt; Size : LongInt; Name : Stri

Процедурные типы
Язык Паскаль позволяет использовать в программе данные типа “процедура” или типа “функция”. Такие данные можно передавать как аргументы подпрограмм, можно описывать и использовать массивы процедур

Указатели и динамическая память
Указателями называются переменные и константы, значениями которых являются адреса. Различаются два вида указателей - обобщенные указатели и

Динамические структуры: списки, деревья
Примеры программ, использующих динамические массивы, приведенные в предыдущей главе, все еще были плохими. Для того чтобы использовать динамические массивы таким образом, мы должны заранее знать ра

Открытые строки
  Открытыми строками, или длинными строками, или C-строками, называются символьные последовательности длиной до 65535 символов, ограниченные справа нуль-символ

Использование командной строки и вызов внешних программ
Паскаль позволяет передавать информацию в программу при ее запуске через командную строку. Для этого служат две стандартные функции -ParamCount и ParamStr.

Обработка программных прерываний
Программное прерывание - это ситуация, возникающая, когда дальнейшее выполнение программы невозможно. Например, деление на ноль, переполнение, ошибка Range check error, обращение по неверному адрес

Объекты
Объектом в языке Паскаль называется совокупность данных и подпрограмм, обрабатывающих эти данные. Программирование с использованием объектов называется объектно-о

Рекурсия и динамическое программирование
В этом и всех последующих разделах речь пойдет уже не о языке программирования Паскаль, а о задачах, которые вы можете решать с помощью этого языка, о наиболее интересных и полезных алгоритмах и пр

Рекурсия и стек отложенных заданий
Рекурсивные алгоритмы далеко не всегда неэффективны, как можно подумать, прочитав предыдущий раздел. Во многих задачах рекурсивные процедуры и функции очень полезны, кроме того, они исключительно п

Стеки и очереди
Значение стека как структуры данных в программировании не исчерпывается лишь стеком отложенных заданий. В этом разделе мы решим с помощью стека задачу о вычислении значения арифметического выражени

Комбинаторные алгоритмы
В этом разделе мы рассмотрим три наиболее важные задачи комбинаторики: нахождение всех подмножеств множества из n элементов; нахождение всех выборок по m элементов из n элементов и нахождение всех

Бинарные деревья
В этом разделе мы рассмотрим различные алгоритмы обхода бинарного дерева. К алгоритмам создания бинарного дерева мы обратимся несколько позже, а пока будем считать, что дере

Упорядоченные бинарные деревья и приоритетные очереди
Упорядоченным бинарным деревом, или бинарным деревом поиска, называют дерево, в любой части которого элементы левого поддерева меньше корневого элеме

Алгоритмы сортировки
В этом разделе мы рассмотрим различные алгоритмы решения задачи сортировки. Задача сортировки ставится следующим образом: дана последовательность записей R1,R

Хотите получать на электронную почту самые свежие новости?
Education Insider Sample
Подпишитесь на Нашу рассылку
Наша политика приватности обеспечивает 100% безопасность и анонимность Ваших E-Mail
Реклама
Соответствующий теме материал
  • Похожее
  • Популярное
  • Облако тегов
  • Здесь
  • Временно
  • Пусто
Теги