只是出于好奇:C#中使用base
关键字的调用是否是动态绑定的(即它是多态调用)?
考虑以下示例:
public class A
{
public virtual void WriteSomething()
{
Console.WriteLine("Hello from A");
}
}
public class B : A
{
public override void WriteSomething()
{
base.WriteSomething();
Console.WriteLine("Hello from B");
}
}
public class Program
{
public static void Main()
{
A instance = new B();
instance.WriteSomething();
}
}
我知道当客户端(在本例中为 Main
方法)调用实例时。写东西
,这个调用是动态绑定的。但是基地呢。在
类 B
中的重写方法中写入某些调用?我假设它不是动态绑定的,因为编译器在编译时知道基类,因此动态绑定不是必需的 - 但我找不到任何文档。
提前感谢您的帮助!
我刚刚看了一下中间语言,可以看到< code>base调用不是动态绑定的(蓝色矩形):
为什么编译器让这个表达式编译,而运行时异常是不可避免的? 我认为< code >动态绑定不应该用于void方法 如果C#规范将上述表达式引用为动态绑定表达式,为什么不编译以下方法?
动态绑定确定在运行时而不是在编译时调用的方法。 动态绑定也称为后期绑定。 在Objective-C中,所有方法都在运行时动态解析。执行的确切代码由方法名称(选择器)和接收对象确定。 动态绑定可实现多态性。例如,考虑一组对象,包括和。 每个对象都有自己的方法实现。 在下面的代码片段中,表达式执行的实际代码是在运行时确定的。 运行时系统使用方法运行的选择器来识别的任何类中的适当方法。 下面来看一下解释
下面的代码有4个类:Base1、Derived1(派生自Base1)、Base2、Derived2(派生自Base2)。两个基本类都有整数data1和display_data()函数。这两个派生类都有整数data1和data2,以及display_data()函数。 我在我的代码中尝试了4个案例,可以在主函数中看到。我不知道哪一个是静态绑定,哪一个是动态绑定。我需要一些帮助。我还想知道,这些情况中
关于静态和动态之间的区别,我仍然有点困惑。据我所知,动态使用对象,而静态使用类型,动态在运行时解析,而静态在编译时解析。所以this.lastName.compare(s1.last名称)不应该使用动态绑定吗? 钥匙compareTo(list[position-1])使用动态绑定 (this . last name . compare to(S1 . last name))为什么使用静态绑定?
我们知道静态绑定发生在私有、静态、最终和重载的方法上,而动态绑定发生在被覆盖的方法上。但是如果我的方法只是公共的,它既不是静态的,也不是覆盖和重载的怎么办? 有人能给我解释一下print()的绑定会怎样,因为它既没有重载也没有被覆盖。
起初我是一个初学者 我看过很多教程,读过很多例子,甚至试图从JLS来理解这个主题,但我仍然有一些困惑或误解。 让我给你看我看不懂的问题。