Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2004.05.23;
Скачать: [xml.tar.bz2];

Вниз

Пропустить элемент из цепи полиморфных вызовов   Найти похожие ветки 

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.033 c
7-1081868205
Paladin
2004-04-13 18:56
2004.05.23
Выключение компа


1-1084344019
goliath
2004-05-12 10:40
2004.05.23
Запуск приложения, написанного в Kylix, на машине, где его нет


14-1083523921
Piter
2004-05-02 22:52
2004.05.23
Гладиатор


9-1074022239
zxc
2004-01-13 22:30
2004.05.23
несколько вопросов.


6-1080925645
Ivolg
2004-04-02 21:07
2004.05.23
Чат





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский