考虑以下 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”。
THelper.m
优先于 TC1.m
。这是预期并记录的行为:
以下代码演示了类助手的声明(记录助手的行为方式相同):
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