我正在调整一个与车辆旅程相关的图书馆,为了这个问题的目的,有两个对象。我碰巧使用vb,但这对于讨论来说是无关紧要的,除了我可以在下面的文本中表达泛型,而不需要编辑器吃尖括号
第一个是Trip对象,它实现了ITrip接口。第二个是实现接口IHop的Hop对象。 Trip和Hop对象都具有不属于接口的功能,但在内部逻辑中使用。
ITrip接口有一个只读属性,名为Route,它是一个IList(IHop)
我想在内部使用List(of Hop)实现它,原因是Trip对象逻辑需要使用Friend函数调整Hop的内容。
我无法提供实现Route属性的代码,因为我无法(显然)从对象转换为其接口。是否有可能,如果是这样的话?
答案 0 :(得分:2)
从Hop
转换为IHop
是一件微不足道的事情 - 不需要语法。同样,从List<Hop>
投射到IList<Hop>
也是微不足道的。
但是,您不能简单地将List<Hop>
转换为List<IHop>
(或IList<...>
),因为它们不兼容。编译器阻止您犯错:List<Hop>
只能包含Hop
个(或Hop
的子类) - 但是,List<IHop>
可以包含我的随机{{ 1}}。如果此演员工作,则允许:
SomeClass : IHop
基本上,您需要重新创建不同类型的列表。 List<Hop> hops = ...
List<IHop> evil = hops;
evil.Add(new SomeClass()); // boom!
class SomeClass : IHop { } // but not a Hop
可能有用:
ConvertAll
您也可以使用(可能更方便,但效率更低):
List<Hop> hops = ...
List<IHop> ihops = hops.ConvertAll(x => (IHop)x);
// or: IList<IHop> ihops = ...
附加:请注意var ihops = hops.Cast<IHop>().ToList();
和IEnumerable<out T>
可以直接投放,这要归功于差异:
IReadOnlyList<out T>