初识继承和多态

      显式调用父类构造函数

      C#可以用base关键字调用父类的构造函数。只要在子类的构造函数后添加":base(参数列表)",就可以指定该子类的构造函数调用父类的哪个构造函数了。这样便可以实现继承

属性的初始化,然后在子类本身的构造函数中完成对子类特有属性的初始化即可。

       示例:

              //Employee类的构造函数

             public  Employee(string id, int age, string name, Gender gender)

                 {

                      this.ID   =   id;

                      this.Age = age;

                      this.Name = name;

                      this.Gender = gender;      

               }

          //SE 类构造函数

      public  SE(string id, string name, int age, Gender gender, int  popularity):

               base(id,age,name,gender)

{

         //继承自父类的属性

         //调用父类的构造函数可以替换掉的代码

         //this.ID   =   id;

         //this.Age = age;

         //this.Name = name;

         //this.Gender =  gender;

         this.Popularity =  popularite;

}

       在上面的示例中,SE类从Employee类继承的属性,如ID、Name、和Gender通过base关键字调用父类的构造函数进行初始化,而SE类自己特有的属性Popularity在

SE类的构造函数中初始化.

 

 

继承的特效

继承的传递性

      在前面我们说卡车和公共汽车继承汽车,也就是卡车和公共汽车都具有汽车的特征。其实卡车还可以分为小型卡车和重型卡车,公共汽车还可以分为单层公共汽车和双层公

共汽车。小型卡车和重型卡车都具有卡车的特征,如载重量、拉货、卸货等,同时他也具有汽车的各种特征。小型卡车is  a卡车,  卡车is   a 汽车,   小型卡车is  a汽车

 

 

is   a 的应用

       如果要实现MyOffice案例中所有人员,包括SE和PM的问号功能,并且要求所有对象都存储在泛型集合List<T>中,该如何实现呢?

       由于SE和PM都继承Employee,即SE   is   a  Employee, PM  is  a  Employee, 所有可以定义一个List<Employee>的集合,SE和PM都可以加入到这个集合中。当要

遍历集合进行问号时,只需对每个对象的类型进行判断.

    //实例化SE对象

       SE   ai  =  new SE("122","艾边成",25,Gender.male,100);

       SE  joe  =  new  SE("113","Joe",30,Gender.female,200);

   //实例化PM对象

      PM  pm  =  new  PM("890","盖茨",50,,Gender.female,30);

      List<Employee>   empls  =  new  List<Emoloyee>();

      empls.Add(ai);

      empls.Add(joe);

      empls.Add(pm);

 

   //遍历问号

  foreach(Employee   empl    in   empls)

    {

          if(empl  is   SE)

           {

               Console.WriteLine(((SE)empl).SayHi());

         }

   }

     

继承的价值

      继承模拟了现实世界的关系,OOP中强调一切皆对象,这符合我们面向对象编程的思考方向。

      继承实现了代码的重用,则在示例中我们已经有所体会,合理地使用继承,会使代码更加简洁。

      继承使得程序结构清晰,子类和父类的层次结构清晰,最终的目的是使子类只关注子类的相关行为和状态,无需关注父类的行为与状态。

 

 

多态:

      访问修饰符     virtual     返回类型      方法名()

      {

               //方法体

       }

 

      访问修饰符   override   返回类型     方法名()

        {

               //方法体

        }

当遍历父类对象调用其方法时,无需考虑子类到底是什么类型,就可以正确地调用子类的相关方法。不同的对象对于同一个方法调用有着不同的执行结果,我们称这种特性为多态。

 

 

     继承必须符合is  a的关系,被继承的类称为父类或者基类,继承其他类的类称为子类或者派生类。

     继承机制很好地解决了代码复用的问题

     子类继承父类的成员,并且可以拥有自己特有的成员

     被protected访问修饰符修饰的成员允许被其他子类访问,而不允许其他非子类访问

     base关键字可以用于调用父类的属性、方法、和构造函数

     继承具有传递性,如果class  A:B,   class   B:C,  则A也可以访问C的成员

     C#中的继承具有单跟性,一个类不能够同时继承自多个父类

     在子类中,如果不使用base关键字来显式调用父类构造函数,则将隐式调用父类默认的构造函数

     如果重载的构造函数有一个没有使用base关键字来指明调用父类的哪个构造函数,则父类必须提供一个默认的构造函数

     多态按字面的意思就是多种形态,指同一 操作用于不同的对象时,可以有不同的解释,产生不同的执行结果

     可以用虚方法实现多态

 

       

 

posted @ 2017-04-07 11:20  樱小路露娜  阅读(149)  评论(0)    收藏  举报