#36.Virtual Method
##36.1 虚方法
虚方法是面向对象程序设计中的一个重要的概念。当从父类中继承的时候,虚方法和被继承的方法具有相同的签名。但是在运行过程中,运行系统将根据对象的类型,自动地选择适当的具体实现运行。虚方法是面向对象编程实现多态的基本手段。
根据维基百科给出的定义,我们可以总结出虚方法的特点:
- 可以被继承,也就是可以被Orverride;- 那么不能被继承的方法就不是虚方法,例如带有private、final和static修饰的方法
- 实现多态的基本手段;
##36.2 Java与C#中的虚函数
###36.2.1 Java中的虚函数
根据36.1中的定义,我们可知在Java中,所有的非static方法默认都是虚方法,除了以下情况:
- 带有final关键字的方法;
- 带有private关键字的方法;
###36.2.2 C#中的虚函数
在C#中,采用了与Java不同的处理方式。在C#中,所有的方法默认都是非虚方法,而要声明虚方法,则需要使用virtual关键字修饰,例如:
public class TestVirtual {
public virtual void Method(){
}
}根绝虚方法的定义可推算:被virtual修饰的方法不能同时被static和sealed修饰!
###36.3 虚方法与非虚方法的异同
虚方法具有多态的特征,而非虚方法则没有。
多态:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在运行时,可以通过指向基类的指针,来调用实现派生类中的方法。
虚方法:
class Program
{
static void Main(string[] args)
{
Parent p = new Child();
p.Say(); // 输出Child Say!
}
}
public class Parent
{
public virtual void Say()
{
Console.WriteLine("Parent Say!");
}
}
public class Child : Parent
{
public override void Say()
{
Console.WriteLine("Child Say!");
}
}非虚方法:
class Program
{
static void Main(string[] args)
{
Parent p = new Child();
p.Say(); // 输出Parent Say!
}
}
public class Parent
{
public void Say()
{
Console.WriteLine("Parent Say!");
}
}
public class Child : Parent
{
new public void Say()
{
Console.WriteLine("Child Say!");
}
}