zoukankan      html  css  js  c++  java
  • 里氏转换

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

  • 相关阅读:
    【crontab】误删crontab及其恢复
    New Concept English there (7)
    New Concept English there (6)
    New Concept English there (5)
    New Concept English there (4)
    New Concept English there (3)
    New Concept English there (2)Typing speed exercise
    New Concept English there (1)Typing speed exercise
    New Concept English Two 34 game over
    New Concept English Two 33 94
  • 原文地址:https://www.cnblogs.com/Jacklovely/p/5435133.html
Copyright © 2011-2022 走看看