Текущий архив: 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