在Delphi中,我可以从同名的类方法调用实例方法吗?

在Delphi中,我可以从同名的类方法调用实例方法吗?,delphi,Delphi,在Delphi中,是否可以让类方法调用具有相同名称的继承实例方法?例如,我试过这样的方法: //... Skipped surrounding class definitions function TSomeAbstractDialogForm.Execute: Boolean; begin Result := ShowModal = mrOk; end; 我有两个继承了抽象对话框形式的专用对话框类,每个类都有自己的工厂方法: class function TSomeInheriting

在Delphi中,是否可以让类方法调用具有相同名称的继承实例方法?例如,我试过这样的方法:

//... Skipped surrounding class definitions

function TSomeAbstractDialogForm.Execute: Boolean;
begin
  Result := ShowModal = mrOk;
end;
我有两个继承了抽象对话框形式的专用对话框类,每个类都有自己的工厂方法:

class function TSomeInheritingDialogForm.Execute: Boolean;
var
  Fm: TSomeInheritingDialogForm;
begin
  Fm := TSomeInheritingDialogForm.Create(nil);
  try
    Result := Fm.Execute;
  finally
    Fm.Free;
  end
end;
这种方法导致了一个永无止境的循环,因为F.Execute没有调用基类的预期实例方法,而是一次又一次地调用工厂方法(导致一堆创建的表单)


当然,显而易见的解决方案是更改工厂方法的名称(我将其命名为CreateAndShow),但这让我感到好奇。为什么编译器没有警告我隐藏的方法?在这种情况下,有没有办法显式调用实例方法?

您可以尝试强制转换。但是最好重命名类函数。(例如创建和执行)

子类中的Execute隐藏父类中的Execute(我认为编译器会对此发出警告)。您可以通过硬石膏访问此文件。但无法区分实例方法和类方法

function TSomeAbstractDialogForm.Execute: Boolean;
begin
  Result := ShowModal = mrOk;
end;

class function TSomeInheritingDialogForm.Execute: Boolean;
var
  Fm: TSomeInheritingDialogForm;
begin
  Fm := TSomeInheritingDialogForm.Create(nil);
  try
    Result := TSomeAbstractDialogForm(Fm).Execute;
  finally
    Fm.Free;
  end
end;
不会

Result := inherited Execute;

做这个把戏吗?

结果:=继承的Execute将不起作用,因为它是在创建的变量上调用的,而不是在类方法中调用的


问题是让类函数和静态方法同名是个坏主意。编译器将它们视为两个独立的世界,可以彼此相邻地编写。

啊,当然,转换为基类。显而易见。为什么我没想到呢?:-)编译器没有警告我,我觉得有点奇怪。Delphi似乎忽略了类方法隐藏实例方法的特殊情况。您的意思是“result:=inherited Fm.Execute;”还是“result:=Fm.inherited Execute;”?总之,看起来太混乱了,IMHO.Inherited也可以工作:result:=Inherited;或结果:=继承执行;