(十九) 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!

浙公网安备 33010602011771号