Delphi 当一个类已经扩展了一个类和一个接口时,如何继承另一个类
我使用Delphi2006,我有一个名为Delphi 当一个类已经扩展了一个类和一个接口时,如何继承另一个类,delphi,oop,class,inheritance,interface,Delphi,Oop,Class,Inheritance,Interface,我使用Delphi2006,我有一个名为TMyClassTest的复杂类,它有许多方法 其中一些方法创建非可视组件,分配这些组件的事件处理程序,并运行这些组件的方法 另外,我有两个类实现相同的接口,如下所示: TMyClass1 = class(Class1, Interface1) ... //procedures from the Interface1 procedure MyClass1Proc1; end; TMyClass2 = class(Class2, Interf
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中的所有方法。
如何避免在两个类(TMyClass1和TMyClass2)上实现(如复制/粘贴)来自TMyClassTest的所有过程?
我不想在三个不同的地方保留相同的代码
根据Arioch的评论,我创建了如下解决方案:
(见附件)
因为我在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样混配,也不支持多个遗传的L+C++。
如果您不能使Class1
和Class2
继承TMyClassTest
,那么您可能必须依赖接口委托:使TMyClassX
不再直接实现Interface1
,而是为他们添加一个TMyClassTest
字段,并将他们的接口1
委托给该字段
我想你最好
接口0
类型中Interface1
继承自Interface0
tmyclassebasecommontrait
类,实现interface 0
TMyClass1InternalEngine(tmyclassebasecommontrait)
和tmyclass2 internalengine(tmyclassebasecommontrait)
以不同的TMyClassX
特定方式实现Interface1(Interface0)
API的其余部分TMyClassX
classes内部私有字段的TMyClass2InternalEngine
type doign real implementationGoogle for“delphi interface delegation”将此显示为顶部链接:检查此问题:1)使Class1和Class2继承自TMYClassTest,或2)使TmyClassX不再直接实现Interface1,而是将其添加到TMYClassTest的一个字段中,并将其Interface1委托给此字段。你真倒霉。Delphi不做多重继承。另一方面,继承是一种过度使用和误用的工具。把这当作一个信号,说明组合是一种方式。Class1不是我的类,不能改变它上的任何东西。@sorin为“delphi interface delegation”做谷歌搜索显示了这一顶部链接:我认为你最好将新的通用函数移到某个Interface0类型中,并使Interface1成为Interface0的子类。然后,让一些TMyClasssBaseCommonTrait类实现Interface0,以及两个子类sec TMyClass1InternalEngine(TMyClasssBaseCommonTrait)和tmyclass2 internalengine(TMyClasssBaseCommonTrait)实现(以不同的、TMyClassX特定的方式,实现Interface1(Interface0)的其余部分)API///Delphi没有类似Scala的特性或类似Py的混合
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;