gpt4 book ai didi

c# - 接口(interface)在内部是如何工作的?

转载 作者:行者123 更新时间:2023-11-30 19:40:18 25 4
gpt4 key购买 nike

在 C# 中,接口(interface)与具有纯虚函数的 C++ 或 Java 有点不同。

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

interface IMyInterface 
{
void Foo();
}

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

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

所以我假设在那种情况下接口(interface)甚至不包含 vtable。

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

最佳答案

您不能覆盖“Foo”的原因是“Root”没有将其标记为虚拟。如果将其标记为虚拟,它的工作方式与任何其他虚拟方法一样,并且可以根据需要从 Child 中覆盖。您可以将 C# 视为默认情况下的密封接口(interface)方法实现。好吧,实际上在 C# 中任何东西都是默认密封的(当然终结器除外......)。

将此与 Java 等语言进行对比,其中所有实例和非私有(private)函数默认都是虚拟的。

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

关于c# - 接口(interface)在内部是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24229396/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com