我与Delphi 2006一起工作,我有一个名为TMyClassTest
的复杂类,该类有许多方法其中一些方法创建了非视觉组件并分配这些组件的事件处理程序并运行这些组件的方法。
也有两个类,可以实现相同的接口,如下:
TMyClass1 = class(Class1, Interface1)
... //procedures from the Interface1
procedure MyClass1Proc1;
end;
TMyClass2 = class(Class2, Interface1)
... //procedures from the Interface1
procedure MyClass2Proc1;
procedure MyClass2Proc2
end;
现在,我也需要TMYCLASS1和TMYCLASS2"继承" tmyClasStest。更多... Interface1必须包含(超出其方法)MyClasStest的所有方法。我如何避免在两个clases(TMYCLASS1和TMYCLASS2)上实现(例如复制/粘贴)。我不想在三个不同的地方保留相同的代码。
根据阿里奥奇的评论,我创建了一个解决方案,例如:(请参阅http://docwiki.embarcadero.com/radstudio/xe3/en/implementing_interfaces#implementing_interfaces_by_delegation_.28win32_only.29)
type
IMyInterface = interface
procedure P1;
procedure P2;
end;
TMyImplClass = class
procedure P1;
procedure P2;
end;
TMyClass1 = class(Class1, IMyInterface)
FMyImplClass: TMyImplClass;
property MyImplClass: TMyImplClass read FMyImplClass implements IMyInterface;
procedure IMyInterface.P1 = MyP1;
procedure MyP1;
end;
TMyClass2 = class(TInterfacedObject, IMyInterface)
FMyImplClass: TMyImplClass;
property MyImplClass: TMyImplClass read FMyImplClass implements IMyInterface;
procedure P3;
procedure P4;
end;
procedure TMyImplClass.P1;
// ...
procedure TMyImplClass.P2;
// ...
procedure TMyClass1.MyP1;
// ...
procedure TMyClass2.P3;
// ...
procedure TMyClass2.P4;
// ...
var
MyClass: TMyClass1;
MyInterface: IMyInterface;
begin
MyClass := TMyClass1.Create;
MyClass.FMyImplClass := TMyImplClass.Create; //Error !!!! FMyImplClass is a read only property !!!
MyInterface := MyClass;
MyInterface.P1; // calls TMyClass1.MyP1;
MyInterface.P2; // calls TImplClass.P2;
end;
因为我在MyClass.FMyImplClass := TMyImplClass.Create;
上有错误,所以我尝试创建FMyImplClass
从TMyClass1
和TMyClass2
声明构造函数,但不正常。还有一些创建FMyImplClass
的方法吗?
现在,我尝试了一个似乎可以正常工作的解决方案。会发生一些隐藏的效果吗?
type
IMyInterface = interface
procedure P1;
procedure P2;
procedure CreateFMyImplClass;
end;
TMyImplClass = class
procedure P1;
procedure P2;
end;
TMyClass1 = class(Class1, IMyInterface)
FMyImplClass: TMyImplClass;
property MyImplClass: TMyImplClass read FMyImplClass implements IMyInterface;
procedure IMyInterface.P1 = MyP1;
procedure MyP1;
procedure CreateFMyImplClass;
end;
TMyClass2 = class(TInterfacedObject, IMyInterface)
FMyImplClass: TMyImplClass;
property MyImplClass: TMyImplClass read FMyImplClass implements IMyInterface;
procedure P3;
procedure P4;
procedure CreateFMyImplClass;
end;
procedure TMyImplClass.P1;
// ...
procedure TMyImplClass.P2;
// ...
procedure TMyClass1.MyP1;
// ...
procedure TMyClass1.CreateFMyImplClass;
begin
FMyImplClass := TMyImplClass.Create;
end;
procedure TMyClass2.P3;
// ...
procedure TMyClass2.P4;
// ...
procedure TMyClass2.CreateFMyImplClass;
begin
FMyImplClass := TMyImplClass.Create;
end;
var
MyInterface: IMyInterface;
begin
if WantRemote then
MyInterface := TMyClass1.Create
else
MyInterface := TMyClass2.Create;
MyInterface.CreateFMyImplClass; // create FMyImplClass ;
MyInterface.P2; // calls TImplClass.P2;
end;
delphi没有类似鳞状的特征或类似python的混合物,也不支持多个继承a la c 。
如果您不能从TMyClassTest
继承Class1
和Class2
,那么也许您必须依靠接口委托:使TMyClassX
不再直接实现Interface1
,而是添加TMyClassTest
的字段并委派他们的字段Interface1
到该字段。
我认为你会更好
- 将这些新的普通功能移至某些
Interface0
类型 - 使
Interface1
从Interface0
继承 - 做一些
TMyClassesBaseCommonTrait
类,实施Interface0
- 制作两个子类
TMyClass1InternalEngine(TMyClassesBaseCommonTrait)
和TMyClass2InternalEngine(TMyClassesBaseCommonTrait)
实施(以不同的是TMyClassX
-特定方式,其余的Interface1(Interface0)
API - 有
TMyClassX
类TMyClass2InternalEngine
的内部私人字段类型Doign Real Indemntation
Google的" Delphi接口委托"为顶级链接:Delphi:如何将接口实现到子对象?