加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

实现.Net接口(C#)

发布时间:2020-12-16 00:16:18 所属栏目:百科 来源:网络整理
导读:可能是一个简单的问题. 我有一个接口(MyInterface)定义一个属性,如下所示: IListIMenuItem MenuCollection { get; } 而实现MyInterface的类 public class MyClass : MyInterface{ public ObservableCollectionMenuItemBase MenuCollection { get { ... } }
可能是一个简单的问题.

我有一个接口(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>派生的.但是如果你能够实现这样的界面,那将是可能的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读