可能重复:
什么是虚拟方法?
在 C# 中,即使您不将基类方法声明为虚拟方法,编译器也会在方法签名匹配时调用最新的派生类方法。如果没有 virtual 关键字,我们只会收到警告消息,说明将调用派生方法(现在可以使用 new 关键字将其删除)。
如果没有 this 关键字,当签名匹配时调用最后一个派生类中的方法时,将方法声明为虚拟方法有什么用。
我不明白这里的东西。“虚拟”是为了代码可读性目的吗?史密斯
这并不是关于“最新的派生方法”。这是关于当你使用多态性时会发生什么。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
可以重新定义虚拟方法。在 C# 语言中,virtual 关键字指定可以在派生类中重写的方法。这使您能够添加新的派生类型,而无需修改程序的其余部分。因此,对象的运行时类型决定了你的程序做什么。
您可以查看详细示例。
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