如何在Delphi中扩展一个通用的集合?

6

我有一个类似这样的通用集合:

TFoo = class;

TFooCollection<T: TFoo> = class(TObjectDictionary<string, T>)
   procedure DoSomething;
end;

它运行良好。

现在我需要像这样扩展 TFooCollection

TBar = class( TFoo );   

TBarCollection<T: TBar> = class(TFooCollection)
   procedure DoSomethingElse;
end;

编译器提示TFooCollection未定义。 由于TBar从TFoo继承,我想利用TFooCollection的方法(适用于TFoo和TBar项目)并在TBar Collections中执行其他操作。

在Delphi中是否有可能实现?


1
作为一条广泛的规则,优先采用封装而不是继承。您真的希望您的类公开集合类的每个方法吗? - David Heffernan
@david,问题在于基类集合中有一些关于保存/加载的逻辑。继承树不深(只有一层),但非常广泛,因为我们有许多具有不同项类的集合。 - MarcosCunhaLima
2个回答

6
你知道如何扩展通用集合 TObjectDictionary,因此在扩展通用集合TFooCollection时可以应用相同的技术。 TObjectDictionary本身不指定类型 - 你需要为其两个泛型类型参数提供值。一个你硬编码为string,另一个你通过转发在TFooCollection中接收到的泛型类型参数来提供。
同样,在指定TBarCollection的基本类型时,可以为TFooCollection类型参数提供硬编码值,也可以从TBarCollection转发参数。 你可能想要做后者。
type
  TBarCollection<T: TBar> = class(TFooCollection<T>)
  end;

这正是我想要的!谢谢。 - MarcosCunhaLima

0

请注意,在泛型类中,类型声明是类型名称的一部分。 编译器非常正确地指出您没有定义TFooCollection类型。您已经定义了一个名为TFooCollection(或TFooCollection)的类型。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接