小编Bim*_*r_R的帖子

DELPHI:泛型和多态

这已被问过几种不同的方式 - 但我还没有找到答案.

有人可以为我澄清一些事情.使用:Delphi XE2

我有一个很大的BaseObject,几乎用于所有东西.与它一起,我有一个通用列表 - BaseList.

延迟是这样的:

TBaseObject = class
... a lot of properties and methods ...
end;

TBaseList<T: TBaseObject> = class(TObjectList<T>)
... some properties and methods ... 
end;
Run Code Online (Sandbox Code Playgroud)

我最近尝试使用Objects []属性将TBaseList声明从一个非常旧的TStringList更改为这个永远不会更通用的泛型列表TObjectList.

但是我遇到了一些问题.BaseUnit是一个文件......每次我下载我的BaseObject时,我都会制作一个专门的列表来跟随它.

所以我会去做类似的事情:

TCustomer = class(TBaseObject)
... customer related stuff ...
end;

TCustomerList<T: TCustomer> = class(TBaseList<T>)
... customer list specific stuff ...
end;
Run Code Online (Sandbox Code Playgroud)

但是现在我希望一个对象包含一个列表 - 它可以容纳任何对象.我想我可以这样做

TControlObject = class(TBaseobject)
  FGenList: TBaseList<TBaseObject>; 
end;
Run Code Online (Sandbox Code Playgroud)

由于BaseList和BaseObject是我的层次结构的顶层,我假设这样的List能够保存我能想到的任何列表.

但我有一种感觉,就是在这里,我失败了...一种TBaseList<TBaseobject>在某种程度上无法与TCustomerList<TCustomer>...... 相提并论......即使TCustomerList并且TCustomer是我的基地的后代.

我希望能够在baselist中使用泛型来实现新对象的安装.即.使用T.Create在populate方法.

以下是完整层次结构的示例: …

delphi generics polymorphism covariance delphi-xe2

10
推荐指数
1
解决办法
2376
查看次数

泛型,多态,接口:解决方案是什么?

我知道标题非常广泛 - 跨越很多!

而且我希望这个问题可能演变成一个更大的"信息wiki thingy".

我学到了什么 - 到目前为止:

  • 使用泛型时 - 理解概念(协方差和逆变).
  • 不要"误用"泛型与继承相结合的概念.我做了,它可以让你直接陷入协方差问题!确保在继承中的正确位置"中断"泛型 - 如果要将两者结合起来.

(请纠正我 - 如果你认为我错了,错过或误解了什么).

我的问题是:

但到现在为止,我花了无数个小时,想弄清楚,如何解决我在桌面上的这个"大难题".而且我已经从你们这些SO用户那里得到了一些很好的答案 - 但是现在是时候让更大规模的工作了.

我冒昧地使用这个: Generics和Polymorphism一起工作

现在我有点困在这一点: 泛型不起作用的情况

为什么我最终得到协方差问题 - 是因为我的层次结构中的类过程.

所以我想知道Interfaces是否是我在这个"传奇"中的下一个大胆举动.如何"跨越"协方差问题.有一件事是发现你确实遇到了这个问题 - 另一件事是"如何解决它".

因此,如果你们中的任何一个好人"在那里"对此有任何意见 - 我都是耳朵.基本上:告诉我去接口(我从来没有从头开始做过).或者......按照你建议的方向给我一块骨头.

我当前的源池如第二个链接所述 - 从顶部开始.

这是我之前发布的一个小片段,显示了我的协方差问题. 大卫好心地解释了 - 为什么我跑进灌木丛......但现在我需要信息 - 如何绕过它.

var    
  aList : TBaseList<TBaseObject>;  // used as a list parameter for methods
  aPersonList : TPersonList<TPerson>;
  aCustomerList : TCustomerList<TCustomer>;
begin
  aPersonList := TPersonList<TPerson>.Create;
  aCustomerList := TCustomerList<TCustomer>.Create;

  aList := aCustomerList;  <-- this FAILS …
Run Code Online (Sandbox Code Playgroud)

delphi generics polymorphism covariance delphi-xe2

6
推荐指数
1
解决办法
513
查看次数

标签 统计

covariance ×2

delphi ×2

delphi-xe2 ×2

generics ×2

polymorphism ×2