【C#】之里氏转换

版权声明:本文为博主原创文章,未经博主允许不得转载。 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这个子类

猜你喜欢

转载自blog.csdn.net/molihuakai_118/article/details/81874484