类助手破坏了虚拟方法的重写

问题描述 投票:0回答:1

考虑以下 Delphi 控制台应用程序:

program Project1;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils;

type
  TC1 = class
    procedure m; virtual;
  end;

  TC2 = class(TC1)
    procedure m; override;
  end;

  type THelper = class helper for TC1
    procedure m;
  end;

procedure TC1.m; begin WriteLn('C1') end;
procedure TC2.m; begin WriteLn('C2') end;
procedure THelper.m; begin inherited m end;

procedure p(c : TC1);
begin
  C.m
end;

begin
  var C := TC2.Create;
  p(c);
  ReadLn
end.

我希望

THelper
的存在不会改变继承并打印“C2”,但程序会打印“C1”,因此不会调用覆盖的
C2.m

注释掉

THelper
(和
THelper.m
)时,程序会按预期打印“C2”。

class delphi overriding virtual helper
1个回答
0
投票
在此示例中,

THelper.m
优先于
TC1.m
。这是预期并记录的行为:

类和记录助手(Delphi)

以下代码演示了类助手的声明(记录助手的行为方式相同):

type
  TMyClass = class
    procedure MyProc;
    function  MyFunc: Integer;
  end;

...

procedure TMyClass.MyProc;
var X: Integer;
begin
  X := MyFunc;
end;

function TMyClass.MyFunc: Integer;
begin
  ...
end;

...

type
  TMyClassHelper = class helper for TMyClass
    procedure HelloWorld;
    function MyFunc: Integer;
  end;

...

procedure TMyClassHelper.HelloWorld;
begin
  Writeln(Self.ClassName); // Self refers to TMyClass type, not TMyClassHelper
end;

function TMyClassHelper.MyFunc: Integer;
begin
  ...
end;

...

var
  X: TMyClass;
begin
  X := TMyClass.Create;
  X.MyProc;    // Calls TMyClass.MyProc
  X.HelloWorld; // Calls TMyClassHelper.HelloWorld
  X.MyFunc;    // Calls TMyClassHelper.MyFunc 

提示:请记住,类帮助器函数

MyFunc
被调用,因为 类帮助器优先于实际的类类型

© www.soinside.com 2019 - 2024. All rights reserved.