![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Pomogite,pls!Kak mojno vipolnit virtual metod dalnego roditelia? [D5, WinME]
NikolaB © (2002-11-15 19:38:00)U MENIA STO-TO TOKOE:
tItem1 = class()
function AsString: string; virtual;
end.
tItem2 = class(tItem1)
function AsString: string; override;
end.
tItem3 = class(tItem2)
function AsString: string; override;
end.
tItem4 = class(tItem3)
function AsString: string; override;
end.
HOCHU STO tItem4.AsString BIT EDNOKOV S tItem1.AsString, NAPRIMER:
function tItem4.AsString: string;
begin
Result:=tItem1(Self).AsString
end;
KONECHNO - NE POLUCHAETSA, NO NAVERNO EST DRUGOI SINTAKSIS, KOTOROI RABOTAET?
NikolaB (2002-11-16 11:46:00) [1]Spasibo za otveta. Viberu pervii variant, no ochen blagodaren, sto pokazali mne vtorogo varianta. Konechno soglasen i s Vashih ocenok kotoroe "obichno voznikaiut" :)
reonid (2002-11-15 20:43:00) [2]Вообще-то такие проблемы обычно возникают при
неправильном проектировании иерархий.
Один из способов решения такой:
tItem1 = class()
function StaticStrFunc: string;
// сам подбери подходящее имя:
// если тебе нужно вызывать эту ф-ю в
// дальних потомках - вероятно, она имеет какой-то
// более конкретный смысл, чем просто AsString
function AsString: string; virtual;
//begin
// Result := StaticStrFunc;
//end;
end.
...
function tItem4.AsString: string;
begin
Result := StaticStrFunc;
end;
Это будет, вероятно, самый правильный путь.
Следует заметить, существует и хакерский способ,
через взятие статического адреса метода:
function tItem4.AsString: string;
type
TAsStringFunc = function: string of object;
var
AsStrFunc: TAsStringFunc;
begin
TMethod(AsStrFunc).Data := Self;
TMethod(AsStrFunc).Code := @TItem1.AsString;
Result := AsStrFunc();
end;