“virtual”修饰符对接口成员有什么影响?

问题描述 投票:0回答:1

假设我有一个像

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#。

c# oop inheritance
1个回答
0
投票

以下:

interface IThing { virtual string A => "A"; }

据我所知,所谓的默认接口方法和虚拟实际上什么也没做,因为:

virtual
修饰符可以用在函数成员上,否则该函数成员将被隐式使用
virtual

即它只是隐式声明方法是虚拟的,因为团队决定不限制此类事情。

另请参阅规范中的虚拟修改器与密封修改器部分:

决定:LDM 2017-04-05 做出:

  • virtual
    应通过
    sealed
    private
    明确表达。
  • sealed
    是使具有主体的接口实例成员成为非
    virtual
  • 的关键字
  • 我们希望允许接口中的所有修饰符
  • ...
© www.soinside.com 2019 - 2024. All rights reserved.