引用:[陈广视频]
虚方法(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 ();
}
}
}