问题的提出
面向对象编程就是,找到对象,调用方法,完成需要的事情. 那么现在有一个场景:有 一个父类 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、里氏转换的第二句话,就是上面模型的全部:强传的前提是,事前就存放的该类型