多态性
如果你拥有对派生对象的引用,那么使用具有new关键字的方法重定义很有效。但是,如果你拥有的是向上类型转换得到的基类引用,而且希望编译器调用派生类的方法实现,那么会发生什么?在这种情况下就出现了多态性(polymorphism).多态性使你能够在类层次结构中多次定义一个方法,这个运行时环境可以调用合适于特定对象的方法版本。
我们通过雇员例子看看这个概念的实际作用。前一个例子工作正常是因为我们有两个对象:Employee对象和SalariedEmployee对象。在更现实的应用程序中,我们可能要从数据库读取所有雇员记录并且填充一个数组。尽管一些雇员是承包商,一些雇员是拿薪水的雇员,但是需要将他们作为相同的类型(基类类型Employee)放进数组。但是,当我们遍
历数组,获取并且调用每个对象的CalculatePay方法时,我们希望编译器调用正确对象的CalculatePay方法的实现。
在下面的例子中,我添加了一个新的类ContractEmployee。主应用程序现在包含一个Employee类型的数组和另外两个附加的方法。LoadEmployees将Employee对象装载进数组,DoPayroll遍历这个数组。调用每个对象的CalculatePay方法。
class Employee
{
public string name;
public Employee(string name)
{
this.name=name;
}
public void CalculatePay()
{
Console.WriteLine("Employee.CalculatePay called for {0}",name);
}
}
class ContractEmployee:Employee
{
public ContractEmployee(string name):base(name)
{}
public new void CalculatePay()
{
Console.WriteLine("ContractEmployee.CalculatePay called for {0}",name);
}
}
class TestNotPolymorphic
{
//Simulating loading from a database.
employees=new Employee[2];
employees[0]=new ContractEmployee("Adam Barr");
employees[1]=new SalariedEmployee("Max Benson");
}
public void DoPayroll()
{
for(int i=0;i<employees.GetLength(0);i++)
{
employee[i].CalculatePay();
}
}
static void Main(string[] args)
{
TestNotPolymorphic t=new TestNotPolymorphic();
t.LoadEmployees();
t.DoPayroll();
}
}