Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.47 MB
Время: 0.06 c
14-1083316983
mfender
2004-04-30 13:23
2004.05.23
Развод с широким размахом?


1-1084189258
Demon_do
2004-05-10 15:40
2004.05.23
Другой вид формы...


14-1083706326
ИМХО
2004-05-05 01:32
2004.05.23
Депортиво - Порту 0:1


11-1055512650
Dimaxx
2003-06-13 17:57
2004.05.23
Модальная KOL-форма из VCL-проекта


8-1078160093
__Alex__
2004-03-01 19:54
2004.05.23
Компонент для загрузки AVI из потока