繁体   English   中英

界面如何在内部工作?

[英]How does an interface work internally?

在C#中,接口与使用纯虚函数或Java的C ++略有不同。

在接口中的C#方法不像其他主要的编译语言那样充当虚函数,这意味着我们无法覆盖它们。

interface IMyInterface 
{
    void Foo();
}

class Root : IMyInterface 
{
    public void Foo() { ... } // OK.
}

class Child : Root
{
    public void Foo() { ... } // Not overrided.
]

所以我假设在这种情况下接口甚至不包含vtable。

如果没有那个或任何指向函数地址的东西,C#中的接口如何在内部知道指定的调用方法在哪里?

你无法覆盖'Foo'的原因是'Root'没有将它标记为虚拟。 如果将其标记为虚拟,则其工作方式与任何其他虚拟方法相同,并且可以根据需要覆盖Child。 默认情况下,您可以将C#视为密封接口方法实现。 好吧,事实上在C#中默认密封任何东西(当然除了终结器......)。

将其与Java等语言进行对比,其中所有实例和非私有函数默认为虚拟。

这并没有回答接口如何在内部工作,但这与CLR有关,而与C#无关。 基本上,CLR生成特定于接口函数的每个调用站点的代码,该代码根据对象查找它应该调用的接口函数的地址(很像普通的虚拟调度)。 当然,当函数不是虚函数时,可以执行静态调用,如您的情况(如果我们引用ChildRoot )。

你将接口与继承混淆了..

在你上面的例子Root实现IMyInterface的,并公开中所定义的特征IMyInterface 在一个完全不同的说明中, Child将对Root的所有实现进行处理,并且大多数暴露了相同特征的超集。

其实你可以覆盖FooChild ,也重新实现,如果你使用explisit接口实现(命名为IMyInterface.Foo

所以你可以:

    interface IMyInterface 
{
    void Foo();
}
class Root : IMyInterface 
{
    public virtual void Foo() {  } 
}

class Child : Root
{
    public override void Foo() { } 

       void IMyInterface.Foo() { } 

}

关于:

如果没有那个或任何指向函数地址的东西,C#中的接口如何在内部知道指定的调用方法在哪里?

你的答案在这里: http//msdn.microsoft.com/en-us/magazine/cc163791.aspx#S12或在推荐的书CLR中通过C#

要记住的重要一点是:.Net接口与继承无关

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM