如果你有TFirstClass和TSecondClass用不上,但还是要简化代码,这里有一个办法:
创建一个适配器的基类:
type
TMyAdapter = class(TObject)
public
procedure FirstMethod; virtual; abstract;
procedure SecondMethod; virtual; abstract;
end;
然后创建一个子类TFirstClassAdapter和TSecondClassAdapter并分别为它们分别提供TFirstClass或TSecondClass的实例的私有引用。添加一个设置此引用的构造函数。覆盖适配器类的方法,以便它们调用适配的类。
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;
与其他班级相同。现在你只需要决定是否创建一次适配器并传递它,或者你是否创建了一个你需要的地方调用的函数,以及哪个函数会为你的具体类提供一个适配器。
如果您使用接口实现适配器,那么您甚至不需要自己管理适配器的生存期。
通过这种方式,您可以获得Ulrich在his answer中给出的多态行为,但无需更改TFirstClass和TSecondClass。
你是否控制了业主? (你能改变班级的定义吗?) – 2009-02-09 16:29:26
OWNER是什么类型。当你对TObject进行类型转换时,我假设指针或整数/红衣主教? – 2009-02-09 21:21:57