里氏转换
作者:互联网
里氏转换
1)、子类可以赋值给父类
2)、如果父类中装的是子类对象,那么可以讲这个父类强转为子类对象。
里氏转换就是将父类转换为合适的子类,或者是用子类代替一下父类,也就是将子类对象给父类
作用
子类对象可以调用父类中的成员,但是父类对象永远都只能调用自己的成员。一开始只有儿子能用爹的方法,里氏转换后,爹也能用儿子的方法了,差不多就是继承的话,子类继承父类,子类能调父类,但是父类不能。但是你把一个子类对象给父类的话,父类就可以转为子类,然后就能使用子类的方法,如果父类没有包含子类,也就是没有把子类给父类,父类就不能强转为子类,就是一个子类对象可以在继承关系里来回转,只不过成派生类时转回基类需要显式。
比如:现在有三个类
基类:Person
派生类:Teacher、Student
将子类对象给父类,
Student student = new Student();
Person person = student;
//或者直接这样写
Person person = new Student();
里氏转换,因为子类继承了父类,并且子类新建对象时在内存中已经开辟了父类的内存空间,
因此可以将新建(注意,没有new父类,因此新建的父类对象没有开辟另外的内存空间)一个父类对象,然后将子类的值赋值给父类.
将装有子类对象的父类转为子类
Person person = new Student();
Student s = (Student)person;//将子类对象赋值给父类,再将父类中的子类对象强制转换成子类
将装有子类对象的父类转为其他子类
Person person = new Student();
Teacher t = (Teacher)person;//这样会 报异常,因为当前父类 装的 是 student这个子类,而不是Teacher这个子类
这样会报异常,因为当前父类里面并没有装Teacher类,而是装的Student类
判断是否能转
is:表示类型转换,如果能够转换成功,则返回一个true,否则返回一个false
as:表示类型转换,如果能够转换则返回对应的对象,否则返回一个null
is
Person person = new Student();
if (person is Teacher)
{
Teacher t = (Teacher)person;
t.Teach();
}
else
{
Console.WriteLine("转换失败 ");
}
as
Person person = new Student();
Teacher t = person as Teacher;//转换失败,结果为空
标签:转换,对象,里氏,person,Student,子类,父类,Teacher 来源: https://www.cnblogs.com/fhzmasl/p/15371668.html