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