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()
{
}
为什么?
答案 0 :(得分:4)
通常原因是你有一个方法具有相同的名称+参数但已经有不同的返回类型。
在C#中这是无效的,在这种情况下实现接口的唯一方法是明确地执行它或者移动/重命名其他方法。
答案 1 :(得分:2)
一个很好的例子是你想要确保该类想要调用的方法。这通常是一种昂贵的方法,不会增加所需的功能。
ObjectCache就是一个很好的例子。您可以使用隐式方法添加,删除和检查项目。 但是,Enumerator是明确定义的。
foreach(var item in (ObjectCache as Enumerator))
{
...
}
这样您就不会在没有明确这样做的情况下枚举整个缓存。
答案 2 :(得分:0)
在显式实现成员btw时要注意的一件重要事情是,派生类无法覆盖其父类中显式实现的接口成员,而不会使该成员不可访问且无法链接到(如果是BaseClass
显式实现IFoo.Foo
,DerivedClass
覆盖它的唯一方法是实现IFoo.Foo
本身;如果派生类这样做,那么IFoo.Foo
将引用到派生类的方法,并且无法访问父类中的IFoo.Foo
实现。因此,如果派生类成员可能需要链接到父类实现,那么将接口成员实现的“胆量”放在protected virtual
成员中通常是个好主意,并且然后显式实现接口成员,因此它只调用protected virtual
。这将允许派生类重写该成员并链接到它。