Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Теоретические вопросы _ Виртуальные методы

Автор: Bokul 2.12.2006 10:24

Серия "Вопросы структурного чайника, который пытается стать объектным самоваром" продолжается.
Для чего или, лучше сказать, в каких случаях надо использовать виртуальные методы? Они дают возможность предкам использовать методы наследников, ну и что? В каких случаях это может пригодится? Мне кажется, что это достаточно трудно спроектировать подобные ситуации, в которых это понадобится. Хотя я очень часто вижу использование этих методов.

Автор: lapp 2.12.2006 16:08

Вот классический пример, накалякал сейчас на скорую руку. Разберись с ним сначала - Ок?
Думаю, заметишь преимущество.

uses
CRT;

type
tThing = object
procedure Show; virtual;
procedure Hide; virtual;
procedure MoveTo(x,y:integer); virtual;
constructor Create;
end;

tStone = object(tThing)
procedure show; virtual;
procedure Hide; virtual;
end;

var
Stone:tStone;

constructor tThing.Create;
begin
end;

procedure tThing.Show;
begin
end;

procedure tThing.Hide;
begin
end;

procedure tThing.MoveTo(x,y:integer);
begin
Hide;
GoToXY(x,y);
Show
end;

procedure tStone.Show;
begin
Write('Stone');
end;

procedure tStone.Hide;
begin
Write(' ');
end;

begin
With Stone do begin
Create;
Show;
ReadLn;
MoveTo(10,10);
ReadLn;
MoveTo(50,10);
ReadLn;
MoveTo(20,20);
ReadLn;
MoveTo(70,15);
ReadLn;
end
end.

Подсказка: наиди в объекте Stone процедуру MoveTo, которую мы используем с ним..

Автор: volvo 2.12.2006 16:50

Цитата
    procedure MoveTo(x,y:integer); virtual;
Здесь виртуальность совершенно не обязательна... Даже если этот метод будет статическим, все равно из него будут вызываться "правильные" процедуры...

Кстати, H.Sutter рекомендует делать открытые (Public, они же интерфейсные) методы НЕвиртуальными, а виртуальными оставлять только Private-методы... yes2.gif

Автор: Bokul 3.12.2006 0:34

Цитата
Кстати, H.Sutter рекомендует делать открытые (Public, они же интерфейсные) методы НЕвиртуальными, а виртуальными оставлять только Private-методы...

То есть виртуальные методы имеют пользу только в пределах одного модуля, программы? Значит логика их применения примерно такая: если методы родителя, которые используются в его других методах, будут переопределены в его потомках, то их надо сделать виртуальными (завертуалить smile.gif )? Правильно?

Автор: volvo 3.12.2006 0:52

Цитата
логика их применения примерно такая:

http://zeus.sai.msu.ru:7000/programming/bp70_ug/bp70ug_091.shtml#5

Автор: Bokul 3.12.2006 7:23

volvo, то что надо!!! respect.gif