【问题标题】:Defining an interface explicitly [duplicate]明确定义接口[重复]
【发布时间】:2012-03-18 00:06:52
【问题描述】:

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()
  {
  }

这是为什么呢?

【问题讨论】:

  • 您的类是否已经继承了一个类或实现了具有相同方法声明的另一个接口(不是IGetMenus)?
  • 但是实现接口的类在哪里呢?
  • 我不知道这个问题之前存在..我知道为什么要显式实现一个接口..但我没有同名的方法...不过我明白了..谢谢

标签: c# interface


【解决方案1】:

通常原因是你已经有一个方法名+参数相同但返回类型不同。

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

【讨论】:

    【解决方案2】:

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

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

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

    这样您就不会在没有明确这样做的情况下枚举整个缓存。

    【讨论】:

    • 很好的例子,下次我被问到为什么我需要显式实现时会记住,但是在这种情况下,问题似乎是 VS 需要显式实现,这通常是重复的方法签名
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-21
      • 1970-01-01
      • 2012-05-30
      • 2014-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多