gpt4 book ai didi

c# - 为什么方法覆盖是运行时绑定(bind)的

转载 作者:太空狗 更新时间:2023-10-30 01:09:41 27 4
gpt4 key购买 nike

覆盖 是允许您更改子类中方法的功能的原则。

例如。

//Overriding
public class test
{
public virtual getStuff(int id)
{
//Get stuff default location
}
}

public class test2 : test
{
public override getStuff(int id)
{
//base.getStuff(id);
//or - Get stuff new location
}
}

当我们在test2中Inherit测试类时编译器知道父类中有一个虚方法。那么为什么 Method overring 是运行时绑定(bind)的而不是编译时间绑定(bind)的?

最佳答案

它是运行时绑定(bind)(如果这是正确的措辞 - 我不相信)因为即使使用 test2 变量,您实际上也可以拥有:

test2 obj = new test3(); // imagine test3 inherits from test2
obj.getStuff(id);

这里的变量是一个test2,但是对象是一个test3。你可能会争辩说,如果它是 sealed 等,但实际上即使是非虚拟实例(非静态)方法也会通过 callvirt 过程。它运作良好,而且速度非常快。此外,callvirt 操作码具有必要的空值检查,这意味着您的代码(在引擎盖下)不必经常检查空值(如果它是静态调用,这将是必要的)

这里唯一的异常(exception)是 struct,它覆盖了 object 方法;以下是一个静态调用:

int i = 1;
string s = i.ToString();

关于c# - 为什么方法覆盖是运行时绑定(bind)的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6211063/

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