![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вызов метода предка класса минуя непосредственного предка. [D5, Win2k]
harisma © (2006-08-17 14:03:00)Вопрос такой: Есть 3 класса А - В - С. В унаследован от А, С унаследован от В. В классах есть перекрытый метод. Как мне из этого метода в классе С вызвать этот же метод класса А? типа как делается inherited для вызова метода непосредственного предка?
default (2006-08-17 14:25:00) [21]Ketmar © (17.08.06 14:24) [9]
это неверный способ([4])
Ketmar (2006-08-17 14:24:00) [22]> [4] harisma (17.08.06 14:15)
а чем этот не нравится? есть конечно, и не один, ивсе через анус. но зачем?
tesseract (2006-08-17 14:22:00) [23]
> tesseract © (17.08.06 14:13) [3]
очепятался. там self.
default (2006-08-17 14:22:00) [24]tesseract © (17.08.06 14:13) [3]
так будет переполнение стека из-за бесконечной рекурсии
begin...end (2006-08-17 14:21:00) [25]Заменить ссылку на VMT, вызвать метод, восстановить ссылку.
default (2006-08-17 14:18:00) [26]A = class
procedure F; virtual;
end;
B = class(A)
procedure F; override;
end;
C = class(B)
procedure F; override;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure A.F;
begin
ShowMessage('A.F');
end;
procedure B.F;
begin
ShowMessage('B.F');
end;
procedure C.F;
var
P: procedure of object;
begin
TMethod(P).Code := @A.F;
TMethod(P).Data := Self;
P;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
O: C;
begin
O := C.Create;
O.F;
end;
как вариант
harisma (2006-08-17 14:15:00) [27]Спасибо. А еще варианты есть?
tesseract (2006-08-17 14:13:00) [28]A(ыуда).CallMethod - должен вызваться именно метод класса А.
harisma (2006-08-17 14:10:00) [29]виртуальный
begin...end (2006-08-17 14:07:00) [30]Статический или виртуальный?