delphi – 泛型,多态,接口:解决方案是什么?
我知道标题非常广泛 – 跨越很多!
而且我希望这个问题可能演变成一个更大的“信息wiki thingy”. 我学到了什么 – 到目前为止: >使用泛型时 – 理解概念(covariance and contravariance). (请纠正我 – 如果你认为我错了,错过或误解了什么). 我的问题是: 但到现在为止,我花了无数个小时,想弄清楚,如何解决我在桌面上的这个“大难题”.而且我已经从你们这些SO用户那里得到了一些很好的答案 – 但是现在是时候让更大规模的工作了. 我用这个冒险进入泛型: 现在我有点困在这一个: 为什么我最终得到协方差问题 – 是因为我的层次结构中的类过程. 所以我想知道Interfaces是否是我在这个“传奇”中的下一个大胆举动. 因此,如果你们中的任何一个好人“在那里”对此有任何意见 – 我都是耳朵. 我当前的源池如第二个链接所述 – 从顶部开始. 这是我早期post的一个小片段,显示了我的协方差问题. 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,但这不允许你以任何有用的方式使用列表.它不是很通用. 接口对这个问题根本无济于事.您可以通过接口(另一种多态)为类提供某些功能,即列表元素.但这不会处理协方差. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |