C# for Unity 编程语言快速入门教程(连载6)---C#OOP编程之继承性

 

   C#的OOP编程之继承性,其本质就是通过继承让子类减少重复代码的编写,达到优化代码的作用。继承具体指“字段”与“方法”的继承,笔者梳理本阶段的知识点如下所示。


1: 概念(基类、派生类)

    生活中有"龙生龙,凤生凤,老鼠天生会打洞",这说的是日常生活中的“继承"现象。类似情形“国民老公--"王思聪"生来就是超级富二代,而一般农民工的子女则相对穷好几个数量级。

    我们C#语言中的继承,通过":"(冒号)来定义继承关系。(类似Java语言的extend关键字)

   

2: 使用base,this关键字

    base 关键字代表父类对象,this关键字代表本类对象(this可以默认不写)。


3: 方法覆盖
   使用 new 关键字显示声明发生方法覆盖。

4: 继承关系中构造函数的应用.
   4.1>先执行父类的构造方法,再执行子类构造方法。
   4.2>作为良好的编程习惯:
        派生类的构造函数在执行初始化时,最好调用基类的构造函数。如果不在派生类显示调用一个基类构造函数,编译器会自动插入对基类的默认构造函数的调用,然后才调用执行派生类构造函数的代码。

5: 类的赋值
     子类对象可以赋值给父类对象,但使用中只能使用父类定义的方法。


  为了让初学者更好的学会继承的理论,现提供如下编程题目,供练习使用。


1:  已知交通工具类定义如下。
class Vehicle{
   private int _length;     //长度
   private int _width;      //宽度
   public void Drive(){};  //驾驶方法
}
要求:(1)实现这个类;(2)定义并实现一个小车类car,是它的派生类,小车本身的私有属性有载人数,小车的方法有init(设置车轮数、重量和载人数),get passenger(获取载人数),print(打印车轮数、重量和载人数)。


2: 编写一个学生和教师的数据输入和显示程序,学生数据有编号、姓名、班号和成绩,教师数据有编号、姓名、职称和部门。
   要求将编号、姓名输入和显示设计成一个类person,并作为学生数据操作类student和教师数据操作类teacher的基类。


3: 定义如下类,编程完成要求的功能。

   1) 定义一个名称为 Vehicle(车辆)类,
         字段定义如下:
         public string clour="while";    //颜色字段
         protected float speed;           //速度字段
         方法如下:
         public void accelerate(){.....}; //加速方法

   2) 定义一个名称为 Car (机动车)类
         字段如下:
         private int price;               //价格字段
         方法如下:
         public void decelerate(){.....}; //减速方法

   3) 编程要求:
       3.1) 把Vehicle 作为父类,Car 作为子类。
       3.2) 在Car 类的main方法中调用显示如下字段: clour, speed, price
       3.3) 在Car 类的main方法中调用显示方法: accelerate(), decelerate().
       3.4) 在Car 类中定义新的字段
              string clour="red";    //颜色字段
              再次运行Car类,记下字段 clour 的运行结果有什么变化? 说明这种现象的原因?
       3.5) 在Car 类中定义新的方法
             public void accelerate(....); //加速方法
                 再次运行Car类,记下方法 accelerate()的运行结果有什么变化? 说明这种现象的原因?

       3.6)  在Car 类的decelerate() 中使用this 关键字调用本类的accelerate()方法。
               在Car 类的decelerate() 中使用base关键字调用父类的accelerate()方法。
               运行程序,解释输出结果。

       3.7)  分别在Vehicle 类,Car类中定义构造方法。
               再次运行程序,解释输出结果。
       
       3.8) 删除Vehicle 原无参构造函数,为 Vehicle 类定义有参构造方法 Vehicle(float mySpeed) ,
                作用:在构造函数中给 speed 字段赋值。 请问如何处理,使得子类代码可以正常运行,
                解释此现象。