• 里氏转换


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

  • 相关阅读:
    08简单推导:手机尾号评分
    07简单推导:生日蜡烛
    06普通推导
    05简单推导:猴子吃桃
    简单推导
    03map用法
    List题目
    02List的使用
    01基础知识
    HDU
  • 原文地址:https://www.cnblogs.com/Jacklovely/p/5435133.html
Copyright © 2020-2023  润新知