实现.Net接口(C#)
可能是一个简单的问题.
我有一个接口(MyInterface)定义一个属性,如下所示: IList<IMenuItem> MenuCollection { get; } 而实现MyInterface的类 public class MyClass : MyInterface { public ObservableCollection<MenuItemBase> MenuCollection { get { ... } } .... } 从我读到的内容来看,ObservableCollection继承自一个IList的Collection,我有一个IMIuItem的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; } 看起来像一个变通方法的黑客(我确实遇到了一些问题,说明没有实例化MenuCollection)以使接口得到满足….是否有更好的方法来实现IInterface1< IInterface2>对象? 我需要这种抽象的原因是因为我正在构建一个prism / unity应用程序,并希望尽可能地将菜单视图模型与显示菜单的功能区ui分离. 解决方法
这与通用方差无关
关于泛型方差有多个答案.这与示例无关.如果您尝试使用ArrayList(无泛型)实现定义为IList的属性,您将看到仍然无法执行此操作. 正确答案 这种行为是因为如果您可以将MenuCollection实现为实现IList< T>的某种类型的属性. (或者从它派生,如果没有指定为接口),那么这是可能的: public interface MyInterface { IList<IMenuItem> MenuCollection { get; set } } public class MyClass : MyInterface { // WARNING: Does not count as implementing the interface -- with good reason public ObservableCollection<MenuItemBase> MenuCollection { get; set; } } var myClass = new MyClass(); var classAsInterface = (MyInterface) myClass; // This is OK of course classAsInterface.MenuCollection = new List<MenuItemBase>(); // OOPS!! 在最后一行中,您已经分配了一个List< MenuItemBase> (就MyInterface而言,MyInterface.MenuCollection的类型为IList< MenuItemBase>)可以告诉属性为ObservableCollection< MenuItemBase>的属性. 当然这不合法,如List< MenuItemBase>显然不是从ObservableCollection< MenuItemBase>派生的.但是如果你能够实现这样的界面,那将是可能的. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |