我需要检查方法是否在课堂上实施。
我的类实现了一个接口。
代码。
IMyInterface = interface
['{538C19EB-22E3-478D-B163-741D6BB29991}']
procedure Show();
end;
TMyClassFormCustomer = class(TInterfacedObject, IMyInterface)
public
procedure Show();
end;
TMyClassFormVendors = class(TInterfacedObject, IMyInterface)
public
procedure Show();
end;
...
procedure TMyClassFormCustomer.Show;
var
Form: TFormCustomer;
begin
Form:= TFormCustomer.Create(nil);
try
Form.ShowModal();
finally
FreeAndNil(Form)
end;
end;
{ TMyClassFormVendors }
procedure TMyClassFormVendors.Show;
begin
end;
可以检查方法TMyClassFormVendors.Show
是否有实现?
当一个方法没有实现时,我在菜单中禁用了项目
感谢。
答案 0 :(得分:3)
我看到了几种可能性:
TMyClassFormVendors
不希望在.Show
中执行任何操作,则只需不要声明并实施IMyInterface
。在您的代码中,您可以使用if Supports(MyClass, IMyInterface)
查询该界面并做出相应的反应(禁用菜单条目)IMyInterface
接口实际上声明了多个方法,其中一些被支持(我不想使用实现这个词,因为所有方法都必须实现)而其他方法则不然,那么你最好将界面分成几个不同的界面,然后按照1 ICapabilities
等方法的界面“CanShow
”。在您的代码中,您可以查询您的类,如if (Myclass as ICapabilities).CanShow
然后...... <登记/>
我个人赞成2.因为这是IMO最干净的方法,但这取决于你想要做什么答案 1 :(得分:2)
您可以使用与处理事件方法类似的方法。所以你想要做的不是直接在你的类中实现该方法,而是添加一个属性,该属性可以存储一个指向你想要使用的实际方法的方法指针。然后在运行时,您只需检查是否已指定指向此方法的指针。
这个代码看起来像这样:
type
//Method type object
TMyMethod = procedure (SomeParameter: Integer) of object;
TMyClass = class(TObject)
private
//Field storing pointer to the method object
FMyMethod: TMyMethod;
protected
...
public
//proerty used for assigning and accesing the method
property MyMethod: TMyMethod read FMyMethod write FMyMethod;
end;
在设计方法对象时,您可以定义要在该方法中使用的参数的数量和类型。
不要忘记您需要为方法属性分配方法才能使用它。你可以随时做到这一点。如果需要,您甚至可以通过将其设置为n来取消设置。 您可以使用与事件方法相同的方式执行此操作
MyClass.MyMethod := MyProcedure;
其中MyProcedure需要具有与之前定义的方法对象类型相同的参数结构。
最后,您可以使用以下方法检查是否已在rundtime分配方法:
if Assigned(MyClass.MyMethod) then
begin
//Do something
end
else //Skip forward
编辑:这种方法的另一个优点是您使用的执行方法可以用完全不同的单位定义和编写。