假设我有一个像
interface IThing { virtual string A => "A"; }
这样的界面。 virtual
关键字对这里的实现类型有什么影响?令人惊讶的是,我在 SO、dotnet
GitHub 页面和讨论以及 learn.microsoft.com
上都找不到任何与此相关的内容,可能埋在所有不相关的内容中,其中单词 interface
和 virtual
以任何组合出现。从我的快速测试来看,它似乎没有任何明显的效果。我的直觉告诉我期望从实现类的层次结构中引入给定的虚拟成员,就好像基实现类已经声明了它们本身一样,但事实并非如此。
例如:
class Thing: IThing
{
}
class Thing2: Thing
{
override public string A => "!"; // ERROR: No suitable method found to override.
}
如果我在
A
上声明 Thing
属性,但没有将其显式声明为 virtual,它仍然无法编译。显然,我也可以自由地定义它们而不使用修饰符,尽管它存在于界面中并且可以编译。无论我做什么,使用 IThing
的代码都只会看到 A
的默认实现,除非该类直接实现接口,而不是通过此设置中的继承实现。
有人可以澄清
virtual
修饰符在接口成员上的使用吗?我使用最新的稳定语言版本的 C#。
以下:
interface IThing { virtual string A => "A"; }
据我所知,所谓的默认接口方法和虚拟实际上什么也没做,因为:
修饰符可以用在函数成员上,否则该函数成员将被隐式使用virtual
virtual
即它只是隐式声明方法是虚拟的,因为团队决定不限制此类事情。
另请参阅规范中的虚拟修改器与密封修改器部分:
决定:LDM 2017-04-05 做出:
- 非
应通过virtual
或sealed
明确表达。private
- 的关键字
是使具有主体的接口实例成员成为非sealed
virtual
- 我们希望允许接口中的所有修饰符
- ...