版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/molihuakai_118/article/details/81874484
前面说到了继承,子类可以继承父类的属性和方法,但是父类也有自己特有的子类不能用的属性和方法,当子类想要调用父类中的一些特有的属性或方法是,就用到了里氏转换,即将子类通过转换变成父类,使用父类中的特有属性和方法后在返回为子类。
#一、里氏转换可能出现的四种情况
##1、
//如果new 后面的是子类,子类变成父类调用父类方法之后,再转换成原来子类可以成功
Person p = new Teacher();
Teacher t = (teacher)p; //强制转换成功
t.SayHi();
##2、
//如果new 后面是子类,子类变成父类调用父类方法之后,转换成另一个子类 会报异常
Person p = new Teacher();
Student stu = (student)p; //强制转换失败
Stu.SayHello();
##3、
//父类对象不能直接转换成子类
Person p = new Person();
Student stu = (Student)p; //强制转换失败
Stu.SayHello();
##4、
//子类转换成父类可以直接隐式转换
Student stu = new Student();
Person p = stu; //直接隐式转换
p.Show();
#二、调试
上面的四种情况代码书写都没有错误,但是在运行时,第二种和第三种会报异常,为了解决这样的问题,出现了里式转换中的is和as判断:
TypeA is type B 仅判断 //返回的是bool类型
TypeA as TypeB 先判断,再转换 //返回的是一个类型
as转换如果转换不成功,不会报异常,返回来的是null
is转换,返回的是bool型,true就是能进行转换,false不能转换
例:
//1、
Person p = new Student();
Bool result = p is Teacher; //判断p是否能够转换成teacher这个子类
If (result)
{
Teacher t = (Teacher)p;
t.SayHi();
}
Else
{
Console.writeline("无法转换");
}
//2、
Person p = new Student();
Teacher t = p as Teacher; //p转换成teacher这个子类