显式定义接口
本文关键字:接口 定义 | 更新日期: 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.Foo
,DerivedClass
覆盖它的唯一方法是实现IFoo.Foo
本身;如果派生类这样做, 然后IFoo.Foo
将引用派生类的方法,并且无法访问父类中的IFoo.Foo
实现(。 因此,如果可能需要派生类成员链接到父类实现,通常最好将接口成员实现的"胆量"放在protected virtual
成员中,然后显式实现接口成员,以便它只调用protected virtual
成员。 这将允许派生类重写该成员并链接到该成员。