【发布时间】:2011-04-07 21:22:49
【问题描述】:
可能是一个简单的问题。
我有一个接口 (MyInterface),它定义了如下属性:
IList<IMenuItem> MenuCollection { get; }
以及实现 MyInterface 的类
public class MyClass : MyInterface
{
public ObservableCollection<MenuItemBase> MenuCollection
{
get
{
...
}
}
....
}
根据我的阅读,ObservableCollection 继承自作为 IList 的 Collection,并且我有实现 IMenuItem 的 MenuItemBase 类 - 这不满足接口吗?
我想接口必须显式实现?
我也试过这个:
public class MyClass : MyInterface
{
public IList<IMenuItem> MenuCollection MenuCollection
{
get
{
if(_menuCollection == null)
_menuCollection = new ObservableCollection<MenuItemBase>();
return _menuCollection as IList<IMenuItem>;
}
}
private ObservableCollection<MenuItemBase> _menuCollection;
}
似乎是一种解决方法 hack(我确实遇到了一些问题,说 MenuCollection 没有被实例化)来满足接口......有没有更好的方法来实现 IInterface1<IInterface2> 对象?
我需要这种抽象的原因是因为我正在构建一个 prism / unity 应用程序,并且希望尽可能地将菜单视图模型与显示菜单的功能区 ui 分离。
【问题讨论】:
-
对我来说,你的“变通办法”感觉是正确的做法......
-
你甚至必须将
_menuCollection转换为IList<IMenuItem>吗?如果ObservableCollection<MenuItemBase>满足IList<IMenuItem>,你应该可以直接退货...不是吗? -
此外,我同意@Stormenet 的观点,即这并不是真正的“黑客”。您已经声明了一个具有泛型返回类型的方法,因此它的实现需要一个泛型返回类型。这意味着方法的调用者不需要担心方法实现使用的具体内部类型。我觉得不错。
-
顺便说一句,您的
as将始终返回 null... -
@djacobson - 我尝试直接返回它,但它会导致编译时错误,我唯一的猜测是它不喜欢为 IList 返回 ObservableCollection - 我必须检查确切的错误当我回到工作岗位时再次