(十九) C#基础学习之继承和里氏转换

一、继承

1. 父类中哪些会被继承?

 * 子类继承父类的属性和方法,但不会继承父类的私有字段 (private)

 * 子类并没有继承父类的构造函数,但会默认调用父类无参数的构造函数, 原因是为了在子类中创建父类对象,让子类可以使用父类中的成员

 * 所以当父类中重新写了一个有参数的构造函数之后,那个无参数的构造函数就会被干掉,子类就调用不到了,会报错

    解决方法:

  - 在父类中重新写一个无参数的构造函数

  - 在子类中显示调用父类的构造函数,用关键词:base()

例子:

下例中,student类继承了Person类,父类构造函数中的name,age,gender属性通过关键词base继承过来

 

2. 方法的继承

  - 当子类中的方法和父类方法重名,则父类的方法将会被隐藏,即不会被调用。但这样写会出现警报。解决方法:

   使用new关键词,消除警报 (即:new的作用是,隐藏从父类那里继承过来的同名成员)

      例子:public new void GetName() {...}

 

二、里氏转换

  1. 子类可以直接赋值给父类

如果一个地方需要一个父类作为参数,我们可以给一个子类代替

  例子:

       Student s = new Student();

   Person p = s; //这样写是对的, 等式右边的子类可以直接赋值给左边的父类

 

 2. 如果父类中装的是子类对象,那么可以将这个父类强转为子类对象

  例子:

   Student ss = (Student) p;

 

 3. is和as类型转换

   * is:检查一个对象是否兼容于指定的类型(即二者之间可不可以类型转换),返回Boolean值。is操作符永远不会抛异常。

     下例中,Person和Programmer 是父类和子类的关系,是可以兼容的

 

输出结果:

转换成功

 

  * as: 表示类型转换。如果能转换成功,则返回对应的对象,否则返回一个null

 

 

* 综上所述:

 - 子类可以直接赋值给父类

 - 但父类不能直接转为子类,需要强制转换,即 子类 子类名称 = (子类)父类;

 - 子类可以调用父类中的属性方法等。但父类不可以调用子类中的方法

例子:

下例中: 父类Person和三个子类中都有一个 Introduction()方法。但for循环中 ps[i].Introduction() 调用的永远是父类Person中的Introduction()方法,调用不了三个子类中的

输出结果:

I am a Person!
I am a Person!
I am a Person!

 

 

正确的写法:

   - 用is判断两个类型之间是否兼容(判断两者之间是否可以类型转换)。若判断结果为true,则进入括号内进行类型转换。

   - 父类不能直接转为子类,必须强制转换,即 (子类)父类

输出结果:

I am a Student!
I am a Teacher!
I am a Programmer!

posted @ 2021-02-21 11:07  七弹指的树  阅读(385)  评论(0)    收藏  举报