在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),但这让我很好奇.为什么编译器没有警告我隐藏的方法?有没有办法在这样的情况下显式调用实例方法?
你可以尝试一个强硬的演员.但最好重命名类函数.(例如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;