我不知道 OWNER 对象类名。所以我必须在我的代码中到处检查:

if TObject(OWNER) is TFirstClass then begin
  TFirstClass(OWNER).FirstFunction;
  TFirstClass(OWNER).SecondFunction;
  ...
end else
if TObject(OWNER) is TSecondClass then begin
  TSecondClass(OWNER).FirstFunction;
  TSecondClass(OWNER).SecondFunction;
  ...
end;

有没有更好的办法?因为如果条件在代码的许多地方我必须这样做。
TFirstClass 和 TSecondClass(我必须运行)的所有函数都是相同的。

注意:我使用 Delphi 5。

最佳答案

如果您无法访问 TFirstClass 和 TSecondClass,但仍想简化您的代码,这里有一个方法:

创建一个适配器基类:

type
  TMyAdapter = class(TObject)
  public
    procedure FirstMethod; virtual; abstract;
    procedure SecondMethod; virtual; abstract;
  end;

然后创建后代类 TFirstClassAdapter 和 TSecondClassAdapter 并分别为它们提供对 TFirstClass 或 TSecondClass 实例的私有(private)引用。添加一个设置此引用的构造函数。覆盖适配器类的方法,以便它们调用适应的类。
type
  TFirstClassAdapter = class(TMyAdapter)
  private
    fObject: TFirstClass;
  public
    constructor Create(AAdaptedObject: TFirstClass);

    procedure FirstMethod; override;
    procedure SecondMethod; override;
  end;

constructor TFirstClassAdapter.Create(AAdaptedObject: TFirstClass);
begin
  inherited Create;
  fObject := AAdaptedObject;
end;

procedure TFirstClassAdapter.FirstMethod;
begin
  fObject.FirstMethod;
end;

procedure TFirstClassAdapter.SecondMethod;
begin
  fObject.SecondMethod;
end;

其他类(class)也一样。现在您只需要决定是创建一次适配器并传递它,还是创建一个可以在任何需要它的地方调用的函数,这将为您的具体类提供一个适配器。

如果您使用接口(interface)实现适配器,那么您甚至不需要自己管理适配器的生命周期。

通过这种方式,您可以拥有 Ulrich 在 his answer 中提供的多态行为,而无需更改 TFirstClass 和 TSecondClass。

10-05 22:25