加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 09:52:24 所属栏目:大数据 来源:网络整理
导读:我知道标题非常广泛 – 跨越很多! 而且我希望这个问题可能演变成一个更大的“信息wiki thingy”. 我学到了什么 – 到目前为止: 使用泛型时 – 理解概念(covariance and contravariance). Do NOT “mis-use”泛型的概念与继承相结合.我做了,它可以让你直接
我知道标题非常广泛 – 跨越很多!

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

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

>使用泛型时 – 理解概念(covariance and contravariance).
> Do NOT “mis-use”泛型的概念与继承相结合.我做了,它可以让你直接陷入协方差问题!确保在继承中的正确位置“中断”泛型 – 如果要将两者结合起来.

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

我的问题是:

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

我用这个冒险进入泛型:
Generics and Polymorphism working together

现在我有点困在这一个:
Situations where Generics won’t work

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

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

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

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

这是我早期post的一个小片段,显示了我的协方差问题.
David亲切地解释了 – 为什么我遇到灌木丛..但现在我需要信息 – 如何绕过它.

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 !!  types not equal ..

end;

问候

解决方法

你无法做你想做的事,但这并不是你如何使用泛型.正如Rob Kennedy所说,拥有TCustomerList< TCustomer>是没有意义的.和TPersonList< TPerson>.泛型的美妙之处在于您可以对不同的元素类型使用相同的列表.这意味着列表和元素类型不得具有任何依赖关系.

你可以这样做:

procedure TSomething.ProcessList<T: TBaSEObject>(const aList: TBaseList<T>);
begin
  // process the list using code that is independent of the actual type of T.
end;

...

var
  aCustomerList: TBaseList<TCustomer>;
  aPersonList: TBaseList<TPerson>;
begin
  ProcessList(aCustomerList);
  ProcessList(aPersonList);

也许您可能必须指定T(一些早期版本的泛型不处理类型推断 – 即它从参数类型中推断T的类型 – 非常好),即

ProcessList<TCustomer>(aCustomerList);
  ProcessList<TPerson>(aPersonList);

但那或类似的东西是你应该做的. IMO,其他任何事情都没有意义.没有必要拥有一个可以容纳任何这些列表的变量,比如你的aList.如果你真的需要一个,你只能使用TObject,但这不允许你以任何有用的方式使用列表.它不是很通用.

接口对这个问题根本无济于事.您可以通过接口(另一种多态)为类提供某些功能,即列表元素.但这不会处理协方差.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读