可能是一个简单的问题。
我有一个接口(interface) (MyInterface),它定义了如下属性:
IList<IMenuItem> MenuCollection { get; }
以及实现 MyInterface 的类
public class MyClass : MyInterface
{
public ObservableCollection<MenuItemBase> MenuCollection
{
get
{
...
}
}
....
}
根据我的阅读,ObservableCollection 继承自一个 IList 集合,并且我有实现 IMenuItem 的 MenuItemBase 类 - 这不满足接口(interface)吗?
我想接口(interface)必须显式实现?
我也试过这个:
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 没有实例化)来满足接口(interface)....有没有更好的方法来实现 IInterface1<IInterface2>
对象?
我需要这种抽象的原因是因为我正在构建一个 prism/unity 应用程序,并希望尽可能地将菜单 View 模型与显示菜单的功能区 ui 分离。
最佳答案
乔恩是对的;这与generic variance 无关。但是,他没有提到您想要的功能称为返回类型协方差。
也就是说,如果 Animal 是 Giraffe 的基类型,则返回 Animal 的接口(interface)方法或返回 Animal 的虚方法可以由返回 Giraffe 的方法实现/特化。由于每只长颈鹿都是动物,因此契约得以履行。
C#不支持返回类型协变;就此而言,CLR 也没有。一些语言支持返回类型协变;例如,想到 C++。 (C++/CLI 实现做了一些偷偷摸摸的技巧来绕过 CLR 的限制。)实现的接口(interface)方法的返回类型、属性的类型等等,都必须完全匹配在 C# 中。
关于c# - 实现 .Net 接口(interface) (C#),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5587817/