Текущий архив: 2004.05.23;
Скачать: CL | DM;
ВнизПропустить элемент из цепи полиморфных вызовов Найти похожие ветки
← →
Daniel (2004-04-29 20:15) [0]Имеется три класса (дед, сын, внук). У деда виртуальный метод, перекрытый и сыном и внуком. Можно ли, сделать так, чтобы при вызове этого метода у объекта типа "внук" произошел полиморфный вызов дедовского метода, а вызов этого метода у сына был пропущен, то есть пропустить элемент из цепи полиморфных вызовов?
← →
Style © (2004-04-29 20:28) [1]
type
TA = class
private
FA: integer;
public
procedure MA; virtual;
end;
TB = class(TA)
private
public
procedure MA; reintroduce;
end;
TC = class(TB)
private
public
procedure MA; reintroduce;
end;
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
procedure TA.MA;
begin
FA := 10;
end;
procedure TB.MA;
begin
FA := 20;
end;
procedure TC.MA;
begin
FA := 30;
end;
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
var
c: TC;
begin
c := TC.Create;
try
TA(c).MA;
finally
Caption:= INtToStr(C.Fa);
c.free;
end;
end;
← →
Daniel (2004-04-29 20:41) [2]> procedure MA; reintroduce
Ну какой же это тогда полиморфизм? Метод просто прячется другим (hides), reintroduce просто заставляет компилятор не ругаться на это.
C override подобное не получается.
P.S. Без обид, я действительно имел ввиду именно позднее связывание.
← →
VMcL © (2004-04-29 20:45) [3]>>Daniel (29.04.04 20:15)
type
TA = class
private
FA: Integer;
public
procedure MA; virtual;
property A: Integer read FA;
end;
TB = class(TA)
public
procedure MA; override;
end;
TC = class(TB)
private
procedure CallGrandPa;
public
procedure MA; override;
end;
procedure TA.MA;
begin
FA := 10;
end;
procedure TB.MA;
begin
inherited MA;
FA := 20;
end;
procedure TC.CallGrandPa;
asm
call TA.MA
end;
procedure TC.MA;
begin
CallGrandPa;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
A: TC;
begin
A := TC.Create;
try
A.MA;
ShowMessageFmt("%d", [A.A]);
finally
A.Free;
end;
end;
← →
Daniel (2004-04-29 21:14) [4]Спасибо большое, понял.
Страницы: 1 вся ветка
Текущий архив: 2004.05.23;
Скачать: CL | DM;
Память: 0.45 MB
Время: 0.036 c