显式定义接口

本文关键字:接口 定义 | 更新日期: 2023-09-27 18:25:58

Visual studio告诉我,如果我没有在接口方面"明确"声明这些方法,我就不会实现这些方法。以下是我的方法:

    public interface IGetMenus
{
    List<Menu> GetMyMenus();
    void InsertMenu(string topic, string subTopic);
    void UpdateMainMenu(int menu_id, string topic);
    void UpdateSubMenu(int menu_id, string topic);
}

下面是Visual Studio希望我如何实现接口的示例:

List<Menu> IGetMenus.GetMyMenus()
  {
  }

为什么?

显式定义接口

通常原因是您有一个具有相同名称 + 参数但返回类型不同的方法。

在 C# 中这是无效的,在这种情况下实现接口的唯一方法是显式执行此操作或移动/重命名其他方法。

一个很好的例子是你想要确保类想要调用的方法。这通常是一种昂贵的方法,不会添加所需的功能。

ObjectCache 就是一个很好的例子。您可以使用隐式方法添加、删除和检查项目。但是,枚举器是显式定义的。

foreach(var item in (ObjectCache as Enumerator))
{
     ...
}

这样您就不会只枚举整个缓存而不显式执行此操作。

在显式实现成员时需要注意的重要一点是,顺便说一句,派生类无法覆盖其父类中显式实现的接口成员,而不会使该成员无法访问且无法链接到(如果BaseClass显式实现IFoo.FooDerivedClass覆盖它的唯一方法是实现IFoo.Foo本身;如果派生类这样做, 然后IFoo.Foo将引用派生类的方法,并且无法访问父类中的IFoo.Foo实现(。 因此,如果可能需要派生类成员链接到父类实现,通常最好将接口成员实现的"胆量"放在protected virtual成员中,然后显式实现接口成员,以便它只调用protected virtual成员。 这将允许派生类重写该成员并链接到该成员。