IPB
ЛогинПароль:

> Правила раздела!

1. Заголовок или название темы должно быть информативным !
2. Все тексты фрагментов программ должны помещаться в теги [code] ... [/code] или [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ" и используйте ПОИСК !
4. НЕ используйте форум для личного общения!
5. Самое главное - это раздел теоретический, т.е. никаких задач и программ (за исключением небольших фрагментов) - для этого есть отдельный раздел!

> ООП
klem4
сообщение 7.02.2006 11:46
Сообщение #1


Perl. Just code it!
******

Группа: Модераторы
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


Есть примерно такая вещь :

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 ... ?

Сообщение отредактировано: klem4 - 7.02.2006 11:48


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов(1 - 7)
volvo
сообщение 7.02.2006 11:57
Сообщение #2


Гость






А ничего менять не надо, просто опиши Work:
Procedure Work(Var Obj: TOPoint);
Begin
Obj.Show;
End;

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

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

P.S. Деструктор я бы тоже сделал виртуальным rolleyes.gif
 К началу страницы 
+ Ответить 
klem4
сообщение 7.02.2006 12:04
Сообщение #3


Perl. Just code it!
******

Группа: Модераторы
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


Да, в том - то и дело что не сработало ...

Вот код :

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.


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 7.02.2006 12:08
Сообщение #4


Гость






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 ?

Сообщение отредактировано: volvo - 7.02.2006 12:25
 К началу страницы 
+ Ответить 
klem4
сообщение 7.02.2006 12:20
Сообщение #5


Perl. Just code it!
******

Группа: Модераторы
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


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


unsure.gif Так твой код у меня помоему по тойже проблеме и не компилируется .. wrong number of parametrs specified... в заголовке - 2, а передается - 4

Сообщение отредактировано: klem4 - 7.02.2006 12:20


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Altair
сообщение 7.02.2006 12:24
Сообщение #6


Ищущий истину
******

Группа: Модераторы
Сообщений: 4 824
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


Цитата
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 ); скорее всего.


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
klem4
сообщение 7.02.2006 12:25
Сообщение #7


Perl. Just code it!
******

Группа: Модераторы
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


Походу smile.gif Все, спасибо всем smile.gif


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 7.02.2006 12:26
Сообщение #8


Гость






Угу, исправил...
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 18.06.2025 14:22
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"