gpt4 book ai didi

C#调用接口(interface)方法非虚实现

转载 作者:太空狗 更新时间:2023-10-30 00:59:53 29 4
gpt4 key购买 nike

我是 C# 的新手,我不明白为什么编译器不提示这段代码。这是类的层次结构:

interface IAble
{
void f();
}

class AAble : IAble
{
public void f()
{
Debug.Log("---->> A - Able");
}
}

class BAble : AAble
{
public void f()
{
Debug.Log("---->> B - Able");
}
}

执行代码:

        IAble i = new BAble();
i.f();

执行 ---->> A - Able 被打印出来。为什么?编译器如何知道应该调用什么函数?

当决定调用哪个函数时 - 运行时还是编译时?如果我破坏了一个新类 class CAble : IAble 怎么办?

最佳答案

因为 AAble 正在实现 IAble 接口(interface),它的 AAble.f 被标记为 IAble.f< 的实现 类型 AAble 的方法。

BAble.f 只是隐藏了 AAble.f 方法,并没有覆盖它。

IAble o = new BAble(); o.f(); // calls AAble.f
AAble o = new BAble(); o.f(); // calls AAble.f
BAble o = new BAble(); o.f(); // calls BAble.f
IAble o = new CAble(); o.f(); // calls CAble.f

在编译时做出决定:

// AAble.f in IL:
.method public final hidebysig newslot virtual
instance void f () cil managed

// BAble.f in IL:
.method public hidebysig
instance void f () cil managed

接口(interface)实现在 IL 中标记为 virtual,即使它在 C# 中未标记为 virtual。该方法在 IL 中也被标记为 final,如果该方法在 C# 中是 virtual,则它不会被标记为 final .

关于C#调用接口(interface)方法非虚实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52203479/

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