![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вызов метода минуя непосредственного предка?
CrowD © (2005-08-30 18:05:00)Привет, All!
можно ли в Delphi имея иерархию из 3 классов в первом из которых опрделем метод, а в 2 последних он переопределен, из последнего 3 класса вызвать метод 1 минуя промежуточный 2, если да то как?
Спасибо.
PVOzerski (2005-08-31 11:13:00) [1]Ну, если нужно обойтись без трюков вроде лазания по 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;
Игорь Шевченко (2005-08-31 10:40:00) [2]
> можно ли в Delphi имея иерархию из 3 классов в первом из
> которых опрделем метод, а в 2 последних он переопределен,
> из последнего 3 класса вызвать метод 1 минуя промежуточный
> 2, если да то как?
Изменить иерархию классов и перестать желать странного.
tesseract (2005-08-30 22:12:00) [3]Вообще согласно теории RTTI ты можешь вызвать метод родителя из любого потомка, так что попробуй.
TUser (2005-08-30 21:50:00) [4]Конопка даже объясняет, почему нельзя, только я точно не воспроизведу.
Турист (2005-08-30 21:42:00) [5]>CrowD (30.08.05 18:05)
type
TMyMethod = procedure (aSelf: Pointer);
procedure TThird.Method;
begin
ShowMessage('3');
TMyMethod(@TFirst.Method)(Self)
end;
CrowD (2005-08-30 18:27:00) [6]а чтонибудь попроще, по примеру inherited ?
begin...end (2005-08-30 18:19:00) [7]> 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:16:00) [8]Class1
function myFunc: integer; virtual;
Class2
function myFunc: integer; override;
Class3
function myFunc: integer; override;
Юрий Зотов (2005-08-30 18:12:00) [9]Уточните - методы статические, динамические или виртуальные. Это важно.
CrowD (2005-08-30 18:11:00) [10]да
begin...end (2005-08-30 18:07:00) [11]Имеется в виду виртуальный метод?