X Tutup
Skip to content

Latest commit

 

History

History
89 lines (73 loc) · 2.32 KB

File metadata and controls

89 lines (73 loc) · 2.32 KB

#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!");
    }
}
X Tutup