虚方法(virtual)

时间:2023-03-09 07:13:18
虚方法(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

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

虚方法(virtual)

再看一段代码:

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 ();

}

}

}