明确定义接口

时间:2012-02-28 14:01:20

标签: c# interface

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

为什么?

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:2)

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

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

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

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

答案 2 :(得分:0)

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