Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Создание объектов



В Турбо Паскаль для создания объектов используются три зарезервированных слова: object, constructor, destructor и три стандартных директивы: private, public, virtual.

Зарезервированное слово object используется для описания объекта. Описание объекта должно помещаться в разделе описания типов:

type

MyObject=object

{Поля объекта}

{Методы объекта}

end;

Если объект порождается от какого-либо родителя, то имя родителя указывается в круглых скобках сразу за словом object:

type

MyDescendantObject=object(MyObject)

end;

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

Пример:

Создать объект, содержащий фамилию, имя, отчество человека.

Program DemoObject;

Type

TPerson=Object

Family: String[20];

Name: String[15];

Father: String[25];

end;

Var

MyPerson:TPerson;

Begin

With MyPerson do

read(Name);

readln;

with MyPerson do

writeln(Name);

readln;

End.

Начинающие программисты достаточно часто используют оператор WITH для присвоения полям начальных значений. В рассмотренном примере действия With MyPerson do read(Name) и with MyPerson do writeln(Name) будут, в общем-то, корректными, но не идеальными. Например, если в задаче часто приходится обращаться к объекту и делать сразу много записей, то естественным является создание процедуры ввода данных, а затем, как следствие, возникает соблазн создать процедуру вывода данных:

Procedure Vvod(Fm,Nm,Fth:string);

Family: String[20];

Name: String[15];

Father: String[25];

begin

Family:=Fm;

Name:=Nm;

Father:=Fth;

end;

Procedure Vivod(Fm,Nm,Fth:string);

Family: String[20];

Name: String[15];

Father: String[25];

begin

Fm:=Family;

Nm:=Name;

Fth:=Father;

end;

Однако, возникает вопрос, почему при разработке процедур Vvod и Vivod специально для обслуживания типа Tperson необходимо снова указывать какой тип записи и какое поле его обрабатывает. Нет ли какого-нибудь способа объединения типа записи в единое целое?

Такой способ имеется и называется методом.

Метод –это процедура или функция, включенная в объект таким образом, что экземпляр данного типа становится доступным для нее изнутри

В определение типа включается только заголовок метода. При определении метода он дополнительно идентифицируется именем типа. Поля и методы являются двумя частями объекта.

Пример объекта предыдущей задачи с методами ввода и вывода.

Program DemoObject;

Type

TPerson=Object

Family: String[20];

Name: String[15];

Father: String[25];

Procedure Vvod(Fm,Nm,Fth:string);

Procedure Vivod(Fm,Nm,Fth:string);

end;

Procedure Tperson.Vvod(Fm,Nm,Fth:string);

begin

Family:=Fm;

Name:=Nm;

Father:=Fth;

end;

Procedure TPerson.Vivod(Fm,Nm,Fth:string);

begin

Fm:=Family;

Nm:=Name;

Fth:=Father;

end;

Var

MyPerson: TPerson; afm,anm,afth:string;

Begin

readln(afm);

readln(anm);

readln(afth);

MyPerson. Vvod(afm,anm,afth;

readln;

MyPerson. Vivod(afm,anm,afth;

writeln(anm);

readln;

End.

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

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

Рассмотрим известную задачу создания управления объектом (птицы, машущей крыльями.)

Program DemoObgect

Uses Graph,CRT;

Type

Ptica=object;

x,y:integer;

vver,pole,vnis:Pointer;

Mize,Size,Lize:integer;

ch:char;

Procedure Draw(xa,ya:integer);

Procedure Mahi(bx,by:integer);

Procedure Polet(ax,ay:integer);

end;

Procedure Ptica.Draw(xa,ya:integer);

Begin

SetColor(14);

SetFillStyle(1,14);

FillEllipse(xa,ya,10,10);

Line(xa-10,ya,xa-30,ya);

Line(xa+10,ya,xa+30,ya);

Line(xa-30,ya,xa-50,ya-20);

Line(xa+30,ya,xa+50,ya-20);

Size:=ImageSize(xa-50,ya-20,xa+50,ya+20);

GetMem(vver,size);

GetImage(xa-50,ya-20,xa+50,ya+20,vver^);

ClearDevice:

FillEllipse(xa,ya,10,10);

Line(xa-10,ya,xa-30,ya);

Line(xa-10,ya,xa+30,ya);

Line(xa-30,ya,xa-50,ya+20);

Line(xa+30,ya,xa+50,ya+20);

Lize:=ImageSize(xa-50,ya-20,xa+50,ya+20);

GetMem(vniz,lize);

GetImage(xa-50,ya-20,xa+50,ya+20,vniz^);

ClearDevice:

end;

Procedure Ptica.Mahi(bx,by:integer);

begin

Mize:=ImageSize(bx,by,bx+100,by+40);

GetMem(pole,mize);

GetImage(bx,by,bx+100,by+40,pole^);

PutImage(bx,by,vver^,1);

delay(70);

PutImage(bx,by,pole^,0);

PutImage(bx,by,vniz^,1);

delay(70);

PutImage(bx,by,pole^,0);

end;

procedure Ptica.Polet(ax,ay:integer);

begin

repeat

if KeyPressed then

begin

ch:=ReadKey;

case ch of

#77:ax:=ax+10;

#75:ax:=ax-10;

#80:ay:=ay+10;

#72:ay:=ay-10;

end;

Mahi(ax,ay);

end;

else Mahi(ax,ay);

until ch=#32;

end;

Var GrDriver, GrMode,alx,aly:integer;

gol:Ptica;

Begin

GrDriver:= Detect;

InitGraph (GrDriver, GrMode, 'C: |Bp|BGI');

readln;

Gol.Draw(100,100);

Gol.Polet(100,100);

readln;

CloseGraph;

End.





Дата публикования: 2015-06-12; Прочитано: 243 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.012 с)...