如何检查Delphi类中是否实现了一个方法

时间:2014-09-11 17:35:46

标签: delphi rtti

我需要检查方法是否在课堂上实施。

我的类实现了一个接口。

代码。

  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是否有实现?

当一个方法没有实现时,我在菜单中禁用了项目

感谢。

2 个答案:

答案 0 :(得分:3)

我看到了几种可能性:

  1. 如果TMyClassFormVendors不希望在.Show中执行任何操作,则只需不要声明并实施IMyInterface。在您的代码中,您可以使用if Supports(MyClass, IMyInterface)查询该界面并做出相应的反应(禁用菜单条目)
  2. 如果您的IMyInterface接口实际上声明了多个方法,其中一些被支持(我不想使用实现这个词,因为所有方法都必须实现)而其他方法则不然,那么你最好将界面分成几个不同的界面,然后按照1
  3. 的说明进行操作
  4. 您还可以声明并实现另一个可能包含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

编辑:这种方法的另一个优点是您使用的执行方法可以用完全不同的单位定义和编写。