Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.08.15;
Скачать: CL | DM;

Вниз

Как вызвать виртуальный перекрытый метод предка?   Найти похожие ветки 

 
tria   (2004-07-29 13:01) [0]

Tcl=Class()
procedure Met(); virtual
end;

TclChild=Class(cl)
procedure Met(); override;
end;

...

var clChild:TclChild;
   cl:Tcl;
begin
 clChild:=TclChild.Create();
 cl:=Pointer(clChild);
 cl.Met();
end;

вызовется TclChild.Met, а надо вызвать Tcl.Met.
Можно ли это сделать?


 
TUser ©   (2004-07-29 13:03) [1]

inherited? По-моему, у него нет особенностей, связанных с виртуальностью метода, хотя точно не помню.


 
tria   (2004-07-29 13:08) [2]

>TUser ©
А поточнее?
В методе TclChild.Met вызов будет Inherited, а вот как из cl в примере вызвать Inherited Met?
Может я просто не знаю синтаксиса?


 
Kurtevich   (2004-07-29 13:30) [3]

попробуй Tcl(cl).Met(); или (cl as Tcl).Met();


 
TUser ©   (2004-07-29 13:35) [4]

Извини, я код не прочитал. Ты после присвоения cl:=Pointer(), cl делаешь указателем на потомка, т.е. он у тебя уже типа TclChild. Зачем так путаться - не очень понятно, заведи себе столько переменнных, сколько надо.


 
tria   (2004-07-29 15:14) [5]

>Kurtevich
Нет. Так не проходит.
>TUser ©
Задача в общих чертах такая.
Есть один предок, у него два потомка.
Есть форма, в которой корректируются только общие поля (поля предка). По окончании корректировки дается процедура Assign(cl). Вот этот Assign - виртуальный метод. Если его перекрыть с директивой Override, то вызывается метод потомка, а не предка.


 
Ega23 ©   (2004-07-29 15:18) [6]

Или заведи общий метод у предка, который не перекрывается у потомков, или пользуйся inherited в перекрытом методе у потомка.


 
tria   (2004-07-29 15:23) [7]

>Ega23 ©
Т.е. то, что хочу я, добиться нормальными средствами в принципе невозможно?


 
Ega23 ©   (2004-07-29 15:31) [8]

Почему невозможно? Возможно. Только криво. В смысле спроектировано криво. У тебя.


 
VMcL ©   (2004-07-29 16:43) [9]

>>tria  (29.07.04 13:01)

TclChild = Class(cl)
 procedure CallParentMet; register;
 // ...
end;

// ...

procedure TclChild.CallParentMet; register;
asm
 call    Tcl.Met
end;

// ...
cl.CallParentMet;


Токмо это извращение. См. [8].


 
Гаврила ©   (2004-07-29 16:47) [10]

Виртуальный на то и виртуальный, чтобы вызывался от того класса, экземпляр которого реально создан. Если надо, чтобы вызывался метод по типу переменной - просто не делай его виртуальным


 
Tria   (2004-07-29 17:04) [11]

>Гаврила ©
Дя я то согласен, и обыкновенно так и есть. Но вот возникла надобность (tria  (29.07.04 15:14) [5]). Естественно, что это можно как-то обойти, но я думал, может есть все-таки какая-нибудь штатная возможность...


 
s999   (2004-07-29 17:41) [12]


> но я думал, может есть все-таки какая-нибудь штатная возможность...


Что-то все-таки недопонимаешь. inherited это и есть штатный метод. Если разжевывать то:

Tcl=Class()
procedure Met(); virtual
end;

TclChild=Class(Tcl)
procedure Met(); override;
procedure Inh_Met;
end;
...
procedure TclChild.Inh_Met();
begin
 inherited Met;
end;

...

var clChild:TclChild;
begin
clChild:=TclChild.Create();
cl.Inh_Met();
end;


 
tria   (2004-07-29 18:20) [13]

Есть решение и такое:

Tcl=Class()
procedure Inh_Met();
procedure Met(); virtual
end;

procedure Tcl.Met();
begin
Inh_Met();
end;

TclChild=Class(Tcl)
procedure Met(); override;
end;
...

var clChild:TclChild;
begin
clChild:=TclChild.Create();
cl:=Pointer(clChild);
cl.Inh_Met();
end;

Удобство - метод один раз объявлен в предке, доступен всем потомкам.
Но это все глубоко ИМХО не штатные средства, а извороты.
Получается, что к методам предка можно доступится только в теле метода потомка, а напрямую вызвать - нельзя.



Страницы: 1 вся ветка

Текущий архив: 2004.08.15;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.023 c
6-1087196537
Separator
2004-06-14 11:02
2004.08.15
закачка на FTP


14-1091015553
Nikolay M.
2004-07-28 15:52
2004.08.15
Задачка


1-1091342370
DeMoN_Astra
2004-08-01 10:39
2004.08.15
звук в TMenu


14-1090841215
AZ
2004-07-26 15:26
2004.08.15
Что такое SOAP и с чем это мыло едят?


4-1088785884
Sormy
2004-07-02 20:31
2004.08.15
CD-ROM Api???