如何在 Delphi 中调用当前级别的虚方法?

yqyhoc1h  于 2022-11-04  发布在  其他
关注(0)|答案(2)|浏览(121)

让我们假设两个类:

Parent = class
public
  procedure virtFunc(); virtual;
  procedure other();
end;

Child = class(Parent)
public
  procedure virtFunc(); override;
end;

通常,从任何地方调用Child示例上的virtFunc都将调用该方法的Child实现。然而,有时调用同一级别的实现是有用的:

procedure Parent.other();
begin
  virtFunc(); // I want to call Parent.virtFunc(), not Child.virtFunc()
end;

"我尝试了什么"
Parent(Self).virtFunc()
(Self as Parent).virtFunc()
而且很明显,我可以(但这不是问题):

  • 对它们进行不同重命名(childFunc与parentFunc),
  • 卸下virtual
    如何在 Delphi 中调用方法的当前级别(非多态)版本?

对于那些谁知道c++,我想一些等价于Parent::virtFunc()

jm81lzqq

jm81lzqq1#

我认为,做到这一点的唯一办法是:
1.通过调用Parent中的非虚拟方法实现Parent.virtFunc
1.当你想以非多态的方式调用virtFunc时,你就调用那个非虚拟的方法,而不是调用virtFunc

d8tt03nd

d8tt03nd2#

一个

{
     получить доступ к предкам даж если их методы виртуальные
     дети выполнятся не будут

     пример
         TV1 = class
            public
             A:integer;
             function GetH:integer;virtual;
         end;

         TV2 =class (TV1)
            public
              B:integer;
             function GetH:integer;override;
         end;
        //////////////////////////////////
        function TV2.GetH:integer;
        begin
          Result:=inherited +B;
        end;
        function TV1.GetH:integer;
        begin
          Result:=A;
        end;
        procedure TForm1.Panel1Click(Sender: TObject);
          var I:TV2;
          s:integer;
        begin

           I:=TV2.Create;
           I.B:=2;
           I.A:=1;

           //хочу получить доступ с формы к TV1.GetH что бы  TV2.GetH не выполнялся
           AmVirtual<TV2,TV1>.G(I,
           procedure(X2:TV1)
           begin
            s:=X2.GetH;
           end);

           showmessage( s.ToString);  // >> 1
           showmessage( I.GetH.ToString);//>> 3
           I.free;
        end;
    }
  type
   AmVirtual<T1,T2:class> =class
    type
     TProc = reference to procedure (X2:T2);
      class procedure G(X1:T1;Proc:TProc);static;
   end;
class procedure AmVirtual<T1,T2>.G(X1:T1;Proc:TProc);
 type
 PClass = ^TClass;
 var
 ClassOld: TClass;
begin
 ClassOld := PClass(X1)^;
 PClass(X1)^ := T2;
 try
   proc(X1 as T2);
 finally
  PClass(X1)^ := ClassOld;
 end;
end;

两个

type
 TProc = procedure (arg:TObject) of object;
var Proc: TProc;

begin
  TMethod(Proc).Data:=self;
  TMethod(Proc).Code:=@TParent.Proc;
  Proc(Sender);

相关问题