第四部分 方法2---------------

 多态性
     如果你拥有对派生对象的引用,那么使用具有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();
            }
        }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值