虚方法(virtual)

虚方法(virtual)

Virtual 关键字用于修饰方法、属性、索引器或事件声明,并且允许在派生类中重写这些对象。

看一段代码:

using System ;

class A

{

    public void F()

    {

       Console.WriteLine ("A.F");

    }

}

class B:A

{

    public new void F() //注意new关键字

    {

       Console.WriteLine ("B.F");

    }

}

class Test

{

    static void Main()

    {

       B b = new B ();

       A a = b;

       a.F ();

       b.F();

    }

}

输出: A.F

       B.F

上述代码在内存中如下图:

 

 

 

再看一段代码:

using System ;

class A

{

    public virtual void F()

    {

       Console.WriteLine ("A.F");

    }

}

class B:A

{

    public override void F()

    {

       Console.WriteLine ("B.F");

    }

}

class C:B

{

    public new   void F()

    {

       Console.WriteLine ("C.F");

    }

}

class Test

{

    static void Main()

    {

       C c = new C ();

       A a = c;

       a.F();

    }

}

输出: B.F

->基类的成员会搜索继承链,找到使用了new修饰符的那个成员之前的成员,然后调用该成员。

多态(polymorphism):

多态是指两个或多个属于不同类的对象,对同一个消息做出不同响应的能力。

->virtual 和 override 关键字 : 多态给子类提供了一种方式,可以自定义如何实现基类所定义的方法;

看下面代码:

using System ;

class Employee

{

    protected string _name;

    public Employee () {}

    public Employee (string name)

    {

       _name = name ;

    }

    public virtual void StartWork()

    {

       Console.WriteLine (_name+"开如工作");

    }

}

class Manager:Employee

{

    public Manager (string name):base (name){}

    public override void StartWork()

    {

       base .StartWork (); //注意base的使用

       Console .WriteLine ("下达任务");

    }

}

class Seller:Employee

{

    public Seller (string name):base (name){}

    public override void StartWork()

    {

       base .StartWork ();

       Console .WriteLine ("销售产品");

    }

}

class Test

{

    static void Main()

    {

       Employee [] emp = new Employee[2] ;

       emp [0]=new Manager ("张三");

       emp [1]=new Seller ("李四");

       foreach (Employee e in emp )

       {

           e.StartWork ();

       }

    }

}

原文地址:https://www.cnblogs.com/0515offer/p/4191906.html