Помощь - Поиск - Пользователи - Календарь
Полная версия: ООП
Форум «Всё о Паскале» > Pascal, Object Pascal > Теоретические вопросы
klem4
Есть примерно такая вещь :

type

TOPoint = object
x,y : word;
constructor Init(a,b,c,d : word);
procedure Show; virtual;
Destructor Done;
end;

TOLine = object(TOPoint)
x1,y1 : word;
constructor Init(a,b,c,d : word);
procedure Show; virtual;
destructor Done;
end;

constructor TOPoint.Init(a,b,c,d : word);
begin
x := a;
y := b;
end;

destructor TOPoint.Done;
begin
end;

procedure TOPoint.Show;
begin
PutPixel(x,y,13);
end;

constructor TOLine.Init(a,b,c,d : word);
begin
x := a;
y := b;
x1 := c;
y1 := d;
end;

destructor TOLine.Done;
begin
end;

procedure TOLine.Show;
begin
Line(x,y,x1,y1);
end;


Так вот можно ли что-то поменять для того, чтобы написанная процедура Work с входным параметром - переменной типа родительского объекта (в данном случае TOPoint) принимала и переменную P : TOPoint и переменную L : TOLine; и выполняля для них соответствующие методы Show ... ?
volvo
А ничего менять не надо, просто опиши Work:
Procedure Work(Var Obj: TOPoint);
Begin
Obj.Show;
End;

ПолиморфизЪм в действии smile.gif

Если у тебя так НЕ сработало - полный код в студию...

P.S. Деструктор я бы тоже сделал виртуальным rolleyes.gif
klem4
Да, в том - то и дело что не сработало ...

Вот код :

uses crt,graph;
type

TOPoint = object
x,y : word;
constructor Init(a,b,c,d : word);
procedure Show; virtual;
Destructor Done;
end;

TOLine = object(TOPoint)
x1,y1 : word;
constructor Init(a,b,c,d : word);
procedure Show; virtual;
destructor Done;
end;

constructor TOPoint.Init(a,b,c,d : word);
begin
x := a;
y := b;
end;

destructor TOPoint.Done;
begin
end;

procedure TOPoint.Show;
begin
PutPixel(x,y,13);
end;

constructor TOLine.Init(a,b,c,d : word);
begin
x := a;
y := b;
x1 := c;
y1 := d;
end;

destructor TOLine.Done;
begin
end;

procedure TOLine.Show;
begin
Line(x,y,x1,y1);
end;

procedure GrOpen;
var
gd, gm, ge : integer;
begin
gd := detect;
InitGraph(gd, gm, '');
ge := GraphResult;
if ge <> grOk then begin
writeln('Graph error !');
writeln(GraphErrorMsg(ge));
readln;
halt(1);
end;
end;

procedure GrClose;
var
ge : integer;
begin
CloseGraph;
ge := GraphResult;
if ge <> grOk then begin
writeln('Graph error!');
writeln(GraphErrorMsg(ge));
readln;
halt(1);
end;
end;

procedure Work(F : TOPoint; a,b,c,d : word);
begin
F.Init(a,b,c,d);
F.Show;
F.Done;
end;

var
p : TOPoint;
l : TOLine;

x,y : word;

begin

clrscr;

GrOpen;

X := GetMaxX;
y := GetMaxY;

Work(P, x div 2, y div 2, 0, 0);
Work(L, 0, 0, x, y);

readln;
GrClose;
end.
volvo
klem4,
нет, так не пойдет !!! СНАЧАЛА инициализируешь объект, а ПОТОМ его передаешь... Иначе нельзя...
Вернее, можно, но с динамическими объектами...

Кстати, еще одно... Вот так будет лучше:
type
TOPoint = object
x, y: word;
constructor Init(a,b: word);
destructor Done;

procedure Show; virtual;
end;

TOLine = object(TOPoint)
x1, y1: word;
constructor Init(a,b,c,d : word);
destructor Done;

procedure Show; virtual;
end;

constructor TOPoint.Init(a,b: word);
begin
x := a;
y := b;
end;

destructor TOPoint.Done;
begin end;

procedure TOPoint.Show;
begin
writeln('topoint')
end;

constructor TOLine.Init(a, b : word);
begin
Inherited Init(a, b); // Вызываешь конструктор предка ...
x1 := c;
y1 := d;
end;

destructor TOLine.Done;
begin
Inherited Done // ... и деструктор предка
end;

procedure TOLine.Show;
begin
writeln('toline');
end;

Procedure Work(var Obj: TOPoint);
Begin
obj.show;
end;

Var
my_point: TOPoint;
my_line: TOline;

begin
my_point.init(1, 2);
my_line.init(3, 4, 5, 6);

work(my_point);
work(my_line);
end.

Зачем передавать ненужные параметры в TOPoint.Init ?
klem4
Цитата
Зачем передавать ненужные параметры в TOPoint.Init ?


unsure.gif Так твой код у меня помоему по тойже проблеме и не компилируется .. wrong number of parametrs specified... в заголовке - 2, а передается - 4
Altair
Цитата
my_point.init(1, 2, 3, 4);

Цитата
my_point: TOPoint;

TOPoint = object
x, y: word;
constructor Init(a,b: word);

естественно, у конструктора в описании только 2 параметра...
просто опечатка , имелось ввиду my_point.init(1, 2 ); скорее всего.
klem4
Походу smile.gif Все, спасибо всем smile.gif
volvo
Угу, исправил...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.