c# - 实现 .Net 接口(interface) (C#)

标签 c# .net interface

可能是一个简单的问题。

我有一个接口(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/

相关文章:

c# - 在 native dll 中创建 C++ 类以在 C# 中使用

c# - 如何从 DataGridView 中的一行获取 DataRow

c# - 如何使用字符串作为索引?

c# - 在 .NET 中运行线程操作时如何响应事件

c# - 接口(interface)和类方法的注释应该如何不同

java - Implements 只能与接口(interface)一起使用吗?

java - Java 接口(interface)中的方法是否应该使用或不使用公共(public)访问修饰符来声明?

c# - 将软件应用程序注册为硬件游戏 handle ?

c# - 同时实现隐式和显式接口(interface)是否有意义?

c# - 我可以使用 ASP.NET Core 6+ WebApplicationBuilder 从 WebApplicationFactory 中排除代码吗?