里氏转换

问题的提出
面向对象编程就是,找到对象,调用方法,完成需要的事情. 那么现在有一个场景:有 一个父类 Person 和两个子类 Student 与 Teacher,在 Main 方法中有 3 个对象,分是 Person 对象、Student 对象和 Teacher 对象. 那么现在想要用一种数据类型将其储存起来,就像数组 一样可以统一管理,该如何是好呢? 这里就需要考虑里氏转换了. 换句话说:里氏转换就是为了处理类型一致而存在的.
里氏转换的两条
对于里氏转换,只用记住两点即可(严格上讲应该是一个模型):

1、子类可以直接赋值给父类

2、父类若指向子类,那么可以强制转化为该子类

里氏转换的最重要的使用是在多态中,为了实现多态. 对于这两条准则,可以分进行 一个演示,看看怎么回事儿.

1 static void Main(string[] args)
2 {  
3     Son son1 = new Son(“张三”);  
4     Person person1 = son1; 
5     person1.Say();  
6     Son son2 = (Son)person1; 
7     son2.SayHello(); 
8     son2.Say();  
9 }

注:  

-> 这里一开始 new 了一个 Son 对象,而后将其赋值给 person1,转化为父类对象  

-> 这里 person1 是一个父类对象,但是里面存放的是一个 Son 类型的引用类型  

-> 因此可以直接将其强转为 Son 对象,再赋值给一个 Son 类型的变量

-> 转化回 Son 类型以后,即可使用子类和父类的方法了 

总结一下: 其实就是将赋值给父类的子类对象,再次的赋值给子类对象.  将里氏转换原则的两句话做一个整合,实际上就是如下代码模型  

父类 父类对象 = new 子类();  

… …  

子类 子类对象 = (子类)父类对象;

对于上面模型有几点要说明:

1、这里只是一个模型框架,代码的实现方式不仅仅就此一种;

2、在中间省略号部分,不允许再次为父类对象赋予其他类型的数据

3、对于里氏转换的第一句话,其实就是上面模型的第一句话

4、里氏转换的第二句话,就是上面模型的全部:强传的前提是,事前就存放的该类型 

原文地址:https://www.cnblogs.com/Jacklovely/p/5435133.html