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

Вниз

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

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

Наверх





Память: 0.47 MB
Время: 0.036 c
1-1125383823
Rogis
2005-08-30 10:37
2005.09.25
Функция заглючила


14-1125945109
Imbalancer
2005-09-05 22:31
2005.09.25
Need help VBA


1-1125850566
hgd
2005-09-04 20:16
2005.09.25
Добавить файл на сервер


3-1123259807
Оран Гутангович
2005-08-05 20:36
2005.09.25
could not convert variant of type(Null) into type (String)


6-1117267905
Глеб
2005-05-28 12:11
2005.09.25
Поиск сервера в сети





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