virtual 用于修饰方法、属性、索引器或事件声明,并使它们可以在派生类中被重写。
例如,此方法可被任何继承它的类重写。虚拟成员的实现可由派生类中的 重写成员更改。
有关使用 virtual 的更多信息,参考微软 使用 Override 和 New 关键字进行版本控制
用关键字 virtual 修饰的方法,叫虚方法。在子类中用override 声明同名的方法,这叫“重写”。相应的没有用virtual修饰的方法,可以叫实方法
默认情况下,C# 方法为非虚方法。 如果某个方法被声明为虚方法,则继承该方法的任何类都可以实现它自己的版本。 若要使方法成为虚方法,必须在基类的方法声明中使用 virtual 修饰符。 然后,派生类可以使用 override 关键字重写基虚方法,或使用 new 关键字隐藏基类中的虚方法。 如果 override 关键字和 new 关键字均未指定,编译器将发出警告,并且派生类中的方法将隐藏基类中的方法。
public class ParentClass
{
public virtual int Number()
{
return 100;
}
}
public class ChildClass : ParentClass
{
public override string Number()
{
return 200;
}
}
ParentClass output = new ParentClass();
//output.Number() 等于 100
ChildClass output = new ChildClass();
//output.Number() 等于 200
ParentClass output = new ChildClass();
//output.Number() 等于 200
在子类中用 new 关键字修饰 定义的与父类中同名的方法,叫覆盖。
覆盖不会改变父类方法的功能。
public class ParentClass
{
public string Number()
{
return 100;
}
}
public class ChildClass : C1
{
public new string Number()
{
return 200;
}
}
ParentClass output = new ParentClass();
//output.Number() 等于 100
ChildClass output = new ChildClass();
//output.Number() 等于 200
ParentClass output = new ChildClass();
//output.Number() 等于 100