gpt4 book ai didi

delphi - 当一个类已经扩展了一个类和一个接口(interface)时如何继承另一个类

转载 作者:行者123 更新时间:2023-12-03 18:32:35 26 4
gpt4 key购买 nike

我使用 Delphi 2006,我有一个名为 TMyClassTest 的复杂类有很多方法
其中一些方法创建非可视组件并分配这些组件的事件处理程序并运行这些组件的方法。

我也有两个实现相同接口(interface)的类,如下所示:

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 的评论,我创建了一个解决方案,例如:
(见 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; 有错误我试图创建 FMyImplClassTMyClass1 声明构造函数和 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 没有类似 Scala 的特征或类似 Python 的 mixin,也不支持像 C++ 那样的多重继承。

如果您无法制作 Class1Class2继承自 TMyClassTest ,那么也许你必须依赖接口(interface)委托(delegate):make TMyClassX不再执行 Interface1直接,而是将它们添加到 TMyClassTest 的字段中并委托(delegate)他们的Interface1到这个领域。

我觉得你最好

  • 将这些新的常用功能移到一些 Interface0类型
  • 制作 Interface1继承自 Interface0
  • 做一些TMyClassesBaseCommonTrait类,实现 Interface0
  • 创建两个子类 TMyClass1InternalEngine(TMyClassesBaseCommonTrait)TMyClass2InternalEngine(TMyClassesBaseCommonTrait)实现(以不同的 TMyClassX 特定方式,Interface1(Interface0) API 的其余部分
  • TMyClassX TMyClass2InternalEngine 的类内部私有(private)字段类型 doign 实际实现

  • 谷歌的“delphi 接口(interface)委托(delegate)”将其显示为顶部链接: Delphi: How delegate interface implementation to child object?

    关于delphi - 当一个类已经扩展了一个类和一个接口(interface)时如何继承另一个类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13972498/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com