C# 关于基类是否可以强制转换为其派生类

简单的理解:

1、可以将一个派生类隐式的赋值给其基类

2、无法将一个基类强制转换为派生类,但一种情况例外,如果基类是由目标派生类或者目标派生类的派生类(即子类的子类)实现的则可以强制的将这个基类转换为对应的派生类。

例如:对于MyBMWCar类继承至 MyCar类,MyCar类继承至MyObject类

a、将一个派生类隐式的赋值给其基类

MyBMWCar bmwCar = new MyBMWCar();
MyCar car = bmwCar;
MyObject obj = car; //或者MyObject obj = bmwCar;

b、无法将一个基类强制转换为派生类

MyObject obj = new MyObject();
MyCar car = (MyCar)obj;//无法实现
MyBMWCar bmwCar = (bmwCar)obj;//无法实现

例外 :基类是由目标派生类或者目标派生类的派生类(即子类的子类)实现的

MyObject obj = new MyCar();
MyCar car = (MyCar)obj;//可以实现

//但是,以下情况是不可以的
MyBMWCar bmwCar = (bmwCar)obj;//无法实现,这句话等同于MyBMWCar bmwCar = (bmwCar)car;已经说了无法将一个基类强制转换为派生类

或者

MyObject obj = new MyBMWCar();
MyCar car = (MyCar)obj;//可以实现
MyBMWCar bmwCar = (bmwCar)obj;//可以实现,这句话等同于MyBMWCar bmwCar = (bmwCar)car;

为什么?

在上面b例子中,看似将基类强制转换成了派生类,但实质是基类obj指向的是一个派生类对象,例如我们把b的第二个例子这样看也许就明白了,我们将MyObject obj = new MyCar();这句代码换种方式表达:

MyCar carobj = new MyCar();
MyObject obj = carobj;//将一个派生类赋值给基类
MyCar car = (MyCar)obj;//同级强制转换可以实现,但这其实是多余的操作

//但是,以下情况还是不可以的
MyBMWCar bmwCar = (bmwCar)obj;//无法实现,这句话等同于MyBMWCar bmwCar = (bmwCar)car;已经说了无法将一个基类强制转换为派生类

 

你可能感兴趣的:(编程理论)