【问题标题】:How to implement an interface to a List object如何实现 List 对象的接口
【发布时间】:2020-01-29 13:33:44
【问题描述】:

好的,这个问题很笼统。我有一个通用接口:

public interface IGizmo<T>

以及实现接口的类

public class A:IGizmo<A>

如何实现接口

IGizmo<List<A>>

关于表单的对象:

List<A> L

或者如果上述方法不可行,是否有一种“自然的方式”来实现从类上定义的接口到列表对象类的接口?

【问题讨论】:

  • 由于List 不在您的控制之下,这是不可能的。这个问题可能太笼统了(请原谅这个表达方式)——A : IGizmo&lt;A&gt; 的构造是一个不寻常的构造,具有通常非常具体的用例(如IEquatable&lt;T&gt;),很难说没有什么正确的“修复”方法知道你用它做什么。 (考虑与IEquatable&lt;T&gt; 的相似之处,没有“等价列表”的概念,但随后有IStructuralEquatableStructuralComparisons,实现了基本目标。)
  • 例如,您可以有一个采用IEnumerable&lt;T&gt; where T : IGizmo&lt;T&gt; 的方法,要求不是集合而是项目实现特定接口;然后,List&lt;A&gt; 将满足此约束。如果你真的想要,你可以通过委托引入一个包装器类型,专门为任何可枚举或列表类型实现IGizmo&lt;MyWrapper&lt;T&gt;&gt;
  • 您是否有特定的用例,或者您只是出于好奇而询问?对于前者,它可能是XY problem。对于后者,答案是:不。你不能改变List&lt;T&gt;,所以你不能让它实现新的接口。另外,为什么(仅?)List&lt;T&gt;?那么数组(T[])呢?或者其他任何实现IList&lt;T&gt; 接口的东西?还是ICollection&lt;T&gt;?甚至IEnumerable&lt;T&gt;List&lt;T&gt; 只是“一堆 T”的一个实现,具有一组非常具体的规则。
  • @Corak 是的好奇心,并试图理解语言是如何工作的(这些对象的内涵是什么,实际上是什么接口等等)
  • 由于List 尤其可用于子类化,因此您可以使用class GizmoList&lt;T&gt; : List&lt;T&gt;, IGizmo&lt;List&lt;T&gt;&gt; where T : IGizmo&lt;T&gt; {} 。不过,这在您的场景中是否有意义是另一回事,这适用于 List,特别是因为您可以从中继承(并非所有集合类型都是如此)。

标签: c# list generics interface


【解决方案1】:

您的接口是通用接口,您的实现可能是:

public class ObjectWithoutList : IGizmo<A>

public class ObjectWithList : IGizmo<List<A>>

如果没有更多上下文,我相信您误解了泛型?如果没有,您能否提供更多信息?

否则,请参阅这些链接以获取有关泛型的更多信息:

Pluralsight Course

Microsoft Docs

【讨论】:

  • 我认为你的答案是正确的方向。我想测试的是是否可以制作类似以下内容:public class A : IGizmo&lt;A&gt;public class List&lt;A&gt; : IGizmo&lt;List&lt;A&gt;&gt;我不知道这样的事情是否有意义(请原谅我,但我是 oop 和 c# 的入门者)
  • @Squaresharper - 为此,您需要更改 List&lt;T&gt; 的实现(正如 Jeroen 解释的那样,您不能这样做),或者您需要创建自己的“List”类,问题是:为什么?你为什么要这样做,或者你是misunderstanding what a list is
猜你喜欢
  • 2019-03-03
  • 1970-01-01
  • 2015-07-03
  • 2011-07-06
  • 1970-01-01
  • 1970-01-01
  • 2019-06-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多