在C#中,即使您没有将基类方法声明为虚拟,编译器也会在方法签名匹配时调用最新的派生类方法。 如果没有virtual关键字,我们只会收到警告消息,说明将调用派生方法(现在可以使用new关键字删除)。
当没有此关键字时,将方法声明为虚拟有什么用途,当签名匹配时,也会调用最后派生类中的方法。
我不明白这里的意思。代码可读性目的是“虚拟”吗? 史密斯
答案 0 :(得分:5)
这不是关于“最新派生方法”。这是关于使用多态时会发生什么。当您在期望父类的上下文中使用派生类的实例时,如果您不使用virtual
/ override
,它将调用父类的方法。
示例:
class A
{
public int GetFirstInt() { return 1; }
public virtual int GetSecondInt() { return 2; }
}
class B : A
{
public int GetFirstInt() { return 11; }
public override int GetSecondInt() { return 12; }
}
A a = new A();
B b = new B();
int x = a.GetFirstInt(); // x == 1;
x = a.GetSecondInt(); // x == 2;
x = b.GetFirstInt(); // x == 11;
x = b.GetSecondInt(); // x == 12;
但是有以下两种方法
public int GetFirstValue(A theA)
{
return theA.GetFirstInt();
}
public int GetSecondValue(A theA)
{
return theA.GetSecondInt();
}
这种情况发生了:
x = GetFirstValue(a); // x == 1;
x = GetSecondValue(a); // x == 2;
x = GetFirstValue(b); // x == 1!!
x = GetSecondValue(b); // x == 12
答案 1 :(得分:0)
可以重新定义虚拟方法。在C#语言中,virtual关键字指定一个可以在派生类中重写的方法。这使您可以添加新的派生类型,而无需修改程序的其余部分。因此,运行时类型的对象决定了程序的功能。
您可以看到详细信息example。
public class Base
{
public int GetValue1()
{
return 1;
}
public virtual int GetValue2()
{
return 2;
}
}
public class Derived : Base
{
public int GetValue1()
{
return 11;
}
public override int GetValue2()
{
return 22;
}
}
Base a = new A();
Base b = new B();
b.GetValue1(); // prints 1
b.GetValue2(); // prints 11