Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.09.25;
Скачать: CL | DM;

Вниз

Вызов метода минуя непосредственного предка?   Найти похожие ветки 

 
CrowD   (2005-08-30 18:05) [0]

Привет, All!

можно ли в Delphi имея иерархию из 3 классов в первом из которых опрделем метод, а в 2 последних он переопределен, из последнего 3 класса вызвать метод 1 минуя промежуточный 2, если да то как?

Спасибо.


 
begin...end ©   (2005-08-30 18:07) [1]

Имеется в виду виртуальный метод?


 
CrowD   (2005-08-30 18:11) [2]

да


 
Юрий Зотов ©   (2005-08-30 18:12) [3]

Уточните - методы статические, динамические или виртуальные. Это важно.


 
CrowD   (2005-08-30 18:16) [4]

Class1
function myFunc: integer; virtual;

Class2
function myFunc: integer; override;

Class3
function myFunc: integer; override;


 
begin...end ©   (2005-08-30 18:19) [5]

> CrowD   (30.08.05 18:11) [2]

type
 TFirst = class
   procedure Method; virtual;
 end;

 TSecond = class(TFirst)
   procedure Method; override;
 end;

 TThird = class(TSecond)
   procedure Method; override;
 end;

var
 Third: TThird;
 ThirdClass: TClass;
begin
 Third := TThird.Create;
 try
   // ...
   ThirdClass := Third.ClassType;
   try
     PPointer(Third)^ := Third.ClassParent.ClassParent;
     Third.Method
   finally
     PPointer(Third)^ := ThirdClass
   end;

   // ...
 finally
   Third.Free
 end
end.


 
CrowD   (2005-08-30 18:27) [6]

а чтонибудь попроще, по примеру inherited ?


 
Турист   (2005-08-30 21:42) [7]

>CrowD   (30.08.05 18:05)  

type
  TMyMethod = procedure (aSelf: Pointer);

procedure TThird.Method;
begin
  ShowMessage("3");
  TMyMethod(@TFirst.Method)(Self)
end;


 
TUser ©   (2005-08-30 21:50) [8]

Конопка даже объясняет, почему нельзя, только я точно не воспроизведу.


 
tesseract ©   (2005-08-30 22:12) [9]

Вообще согласно теории RTTI ты можешь вызвать метод родителя из любого потомка, так что попробуй.


 
Игорь Шевченко ©   (2005-08-31 10:40) [10]


> можно ли в Delphi имея иерархию из 3 классов в первом из
> которых опрделем метод, а в 2 последних он переопределен,
> из последнего 3 класса вызвать метод 1 минуя промежуточный
> 2, если да то как?


Изменить иерархию классов и перестать желать странного.


 
PVOzerski ©   (2005-08-31 11:13) [11]

Ну, если нужно обойтись без трюков вроде лазания по VMT, почему бы не вот так:

type
 t1 = class
   function VeryImportant: integer; virtual;
 end;

 t2 = class(t1)
   function VeryImportant: integer; override;
   function OldMethod: integer;
 end;

 t3 = class(t2)
   function VeryImportant: integer; override;
 end;

function t1.VeryImportant: integer;
begin
 Result := 1;
end;

function t2.VeryImportant: integer;
begin
 Result := 2;
end;

function t3.VeryImportant: integer;
begin
 Result := 3;
end;

function t2.OldMethod: integer;
begin
 Result := inherited VeryImportant;
end;



Страницы: 1 вся ветка

Текущий архив: 2005.09.25;
Скачать: CL | DM;

Наверх




Память: 0.46 MB
Время: 0.04 c
1-1125471494
Ксардас
2005-08-31 10:58
2005.09.25
Символ & перед именем файла


2-1124113351
Novice
2005-08-15 17:42
2005.09.25
Вопрос по TreeView


8-1115913955
ArtKil
2005-05-12 20:05
2005.09.25
Как сделать эквалайзер?


14-1125253208
Light
2005-08-28 22:20
2005.09.25
штрих коды


8-1115793414
Deka
2005-05-11 10:36
2005.09.25
Нет ли у кого описания для формата RAW фотоаппаратов Olympus?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский