none
里氏替换原则 和装箱 有什么关系?? RRS feed

答案

  • 菜鸟提问
    里氏替换原则 和 装箱 有什么关系??

    说一点自己的看法:

    里氏替换原则是我们在程序设计时的一个指导性原则,是指子类型必须能替换掉它们的基类型。(《敏捷软件开发-原则、模式与实践》第10章)。


    这个原则是用于约束子类与父类在操作接口的一致性方面的要求。该原则实质上有两个含义:

    1.若一个类是另一个类的子类,则该子类需要继承所有父类的成员,而不是部分成员,否则不应采用继承关系。

    2.更深层次的,除了满足第一条定义的语法约束以外,子类的覆写(override)必须遵守父类接口的语义契约。

    用俗话说就是:老鼠的儿子生来会打洞,表述的是一种继承关系 ,继承必须确保超类所拥有的性质在子类中仍然成立。”也就是说,当一个子类的实例应该能够替换任何其超类的实例时,它们之间才具有Is-A关系。


    装箱和拆箱指对象类型和值类型之间相互转换的操作。装箱是将值类型转换为 object 类型或由此值类型实现的任一接口类型的过程。当 CLR 对值类型进行装箱时,会将该值包装到 System.Object 内部,再将后者存储在托管堆上。

    int i = 123;
    object o = (object)i;  // 装箱。


    一般来说,里氏替换原则是相对于纯继承而言,讨论了大家在程序设计时如何避免滥用继承,从复用度以及耦合度与层次规模两个层面来考虑,因为复用而选择继承的结构,需要谨慎的考虑变化对程序结构带来的影响,一般来说,优先使用组合(组合+接口隔离+纯继承)。


    由于.NET的所有类型都是由基类System.Object继承过来的,包括最常用的基础类型:int, byte, short,bool等,也就是说,这些基本类型也是System.Object的派生类,在操作过程中必然会存在装箱/拆箱操作,所以说来说去,如果非得说里氏替换原则和装箱的关系的话,可以从下面的例子看一下:

    ======================================================================

    里氏替换原则强调:子类对象可以代替父类对象,但其父类对象不能代替子类对象.
    如:有一个父类:public   abstract   class   A{}
          有两个子类都继承父类A:
                                                public   class   B:A{}
                                                public   class   C:A[]
          那么运用里氏替换原则就可以:
                                                  A   a   =   new   B(); //装箱 或:A   a   =   new   C(); //装箱
          但不可以:   B   b   =   new   A();  


    2010年3月5日 2:35
  • 你好!
         里氏替换原则说的就是实现继承关系的一些原则!
         装箱是把一个值类型实例封装成引用类型的实例的过程,这里也可以勉强说和
    里氏替换原则有些关系,由于.NET中Object是一切类型的基类,值类型的实例,因为值类型的实例可以替换Object!
    周雪峰
    2010年3月5日 4:55
    版主
  • 里氏替换原则直观理解就是子类是父类
    装箱 上面的版主已经解释清楚了
    2010年3月7日 7:38

全部回复

  • 菜鸟提问
    里氏替换原则 和 装箱 有什么关系??

    说一点自己的看法:

    里氏替换原则是我们在程序设计时的一个指导性原则,是指子类型必须能替换掉它们的基类型。(《敏捷软件开发-原则、模式与实践》第10章)。


    这个原则是用于约束子类与父类在操作接口的一致性方面的要求。该原则实质上有两个含义:

    1.若一个类是另一个类的子类,则该子类需要继承所有父类的成员,而不是部分成员,否则不应采用继承关系。

    2.更深层次的,除了满足第一条定义的语法约束以外,子类的覆写(override)必须遵守父类接口的语义契约。

    用俗话说就是:老鼠的儿子生来会打洞,表述的是一种继承关系 ,继承必须确保超类所拥有的性质在子类中仍然成立。”也就是说,当一个子类的实例应该能够替换任何其超类的实例时,它们之间才具有Is-A关系。


    装箱和拆箱指对象类型和值类型之间相互转换的操作。装箱是将值类型转换为 object 类型或由此值类型实现的任一接口类型的过程。当 CLR 对值类型进行装箱时,会将该值包装到 System.Object 内部,再将后者存储在托管堆上。

    int i = 123;
    object o = (object)i;  // 装箱。


    一般来说,里氏替换原则是相对于纯继承而言,讨论了大家在程序设计时如何避免滥用继承,从复用度以及耦合度与层次规模两个层面来考虑,因为复用而选择继承的结构,需要谨慎的考虑变化对程序结构带来的影响,一般来说,优先使用组合(组合+接口隔离+纯继承)。


    由于.NET的所有类型都是由基类System.Object继承过来的,包括最常用的基础类型:int, byte, short,bool等,也就是说,这些基本类型也是System.Object的派生类,在操作过程中必然会存在装箱/拆箱操作,所以说来说去,如果非得说里氏替换原则和装箱的关系的话,可以从下面的例子看一下:

    ======================================================================

    里氏替换原则强调:子类对象可以代替父类对象,但其父类对象不能代替子类对象.
    如:有一个父类:public   abstract   class   A{}
          有两个子类都继承父类A:
                                                public   class   B:A{}
                                                public   class   C:A[]
          那么运用里氏替换原则就可以:
                                                  A   a   =   new   B(); //装箱 或:A   a   =   new   C(); //装箱
          但不可以:   B   b   =   new   A();  


    2010年3月5日 2:35
  • 你好!
         里氏替换原则说的就是实现继承关系的一些原则!
         装箱是把一个值类型实例封装成引用类型的实例的过程,这里也可以勉强说和
    里氏替换原则有些关系,由于.NET中Object是一切类型的基类,值类型的实例,因为值类型的实例可以替换Object!
    周雪峰
    2010年3月5日 4:55
    版主
  • 里氏替换原则直观理解就是子类是父类
    装箱 上面的版主已经解释清楚了
    2010年3月7日 7:38