【发布时间】:2012-02-19 19:45:44
【问题描述】:
我通过具有返回接口类型的方法的外观公开 API,并且在 C#/.NET 3.5 中遇到了泛型列表和继承问题。
我有两个接口:
IMyList(实现 IList
IMyItem
还有三个班级:
MyList(实现 IMyList,扩展 List
MyOtherList(实现 IMyList,扩展 ObservableCollection
MyItem(实现 IMyItem)
但这似乎不可能。我应该如何只公开必要的内容,但仍然调用方法的正确实现(例如在 MyList 和 MyOtherList 之间可能会有所不同)?
编辑:
我的外观是一个看起来像这样的工厂:
public static class Facade {
public static IMyList<IMyItem> CreateList() {
return new MyList<MyItem>();
}
public static IMyItem CreateItem() {
return new MyItem();
}
public static IConfiguration CreateConfiguration() {
return new Configuration();
}
}
用法:
var list = Facade.CreateList();
list.DoSomethingOnChildren();
现在我期待在 MyList 中实现的 DoSomethingOnChildren() 可以在一系列 MyItem 对象上执行。如果我要改变返回的方法:
public static IMyList<IMyItem> CreateList() {
return new MyOtherList<MyOtherItem>();
}
我希望在 MyOtherList 中实现的 DoSomethingOnChildren() 能够在一系列 MyOtherItem 对象上执行。
【问题讨论】:
-
使用“return new MyList
();”这是您尝试解决的协方差问题,C# 不支持。 -
但是如果我有一个 MyList
例如 MyOtherItem 实现了 IMyItem。如何正确投射和返回此列表? -
创建一个 MyList
,然后用 MyItem 或 MyOtherItem 的实例填充它。如果这不可能,那么您将需要使用 LINQ .Cast (或功能等效项)。这将类似于 "new MyList .Cast ().ToList()" 请注意,这是遍历该列表中的每个项目并对其进行转换,这是您需要做的,因为协方差不是支持。 -
说 MyOtherList
有某些方法依赖于仅在 MyOtherItem 中公开的方法,那我该怎么做呢?我的想法是使用 MyOtherList 中的 MyOtherItem 独有的方法,然后将其作为 IMyList 返回,但也许这从根本上是错误的?
标签: c# generics inheritance .net-3.5 polymorphism