c# - C#调用接口方法非虚实现
问题描述
我是 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
接口,所以将其AAble.f
标记IAble.f
为 type 方法的实现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
接口实现virtual
在 IL 中被标记为,即使它在 C# 中没有被标记为虚拟。该方法final
在 IL 中也被标记为,如果该方法virtual
在 C# 中,则不会被标记为final
.
推荐阅读
- python - 使用python上传wav文件并保存在目录中
- c - 原始 TCP 套接字在发送初始数据后接收常量 PSH、ACK 数据包
- excel - 如何以某种格式在excel中打印今天的日期
- regex - Ansible lineinfile - apache 虚拟主机块
- excel - 从文件夹中最新的 excel 文件导入工作表?第一次使用VBA
- python - OpenCV2将图像转换为灰度并找到边缘但出现此错误
- python - 如何创建图像按钮 - Python
- android - Kotlin Android Studio 警告“不要用 setText 连接显示的文本。将资源字符串与占位符一起使用。”
- amazon-web-services - 使用 cli 的 Amazon Lex
- spring-boot - Jpa OneToOne 共享主键一半有效