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

时间:2008-12-23 15:59:34

标签: delphi

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),但这让我很好奇。为什么编译器没有警告我隐藏的方法?有没有办法在这种情况下显式调用实例方法?

3 个答案:

答案 0 :(得分:5)

你可以尝试一下硬拼。但最好重命名类函数。 (例如CreateAndExecute)。

子类中的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;

答案 1 :(得分:1)

结果:=继承执行将不会执行,因为它是在创建的变量上调用的,而不是在类方法中调用。

问题在于,使用具有相同名称的类函数和静态方法是个坏主意。编译器将它们视为两个独立的世界,可以彼此靠近地写。

答案 2 :(得分:0)

岂不

Result := inherited Execute;

诀窍?