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