zoukankan      html  css  js  c++  java
  • 软件构造 第五章第二节 设计可复用的软件

    第五章第二节  设计可复用的软件

    1.LSP

    -Subtypes can add, but not remove methods 子类型可以增加方法,但不可删

    – Concrete class must implement all undefined methods 子类型需要实现抽象

    类型中的所有未实现方法

    – Overriding method must return same type or subtype 子类型中重写的方法

    必须有相同或子类型的返回值

    – Overriding method must accept the same parameter types 子类型中重写的

    方法必须使用同样类型的参数

    – Overriding method may not throw additional exceptions 子类型中重写的方

    法不能抛出额外的异常

     

    – Same or stronger invariants 更强的不变量

    – Same or weaker preconditions 更弱的前置条件

    – Same or stronger postconditions 更强的后置条件

     

    强行为子类型化

     

    协变:

    父类型->子类型:越来越具体specific

    返回值类型:不变或变得更具体

    异常的类型:也是如此

     

    反协变

    父类型->子类型:越来越具体specific

    参数类型:要相反的变化,要不变或越来越抽象

     

    2.数组是协变的

     

    3、泛型中的LSP

    使用通配符"?"

     

    • 泛型是类型不变的(泛型不是协变的)。举例来说 
      • ArrayList<String> List<String>的子类型 
      • List<String>不是List<Object>的子类型
    • 在代码的编译完成之后,泛型的类型信息就会被编译器擦除。因此,这些类型信息并不能在运行阶段时被获得。这一过程称之为类型擦除(type erasure)。
    • 类型擦除的详细定义:如果类型参数没有限制,则用它们的边界或Object来替换泛型类型中的所有类型参数。因此,产生的字节码只包含普通的类、接口和方法。
    • 类型擦除的结果: <T>被擦除 T变成了Object

     

    4. Delegation and Composition

    如果要用Collections.sort()

     

     

    方法一:继承comopartor

    Override:int compare(T o1, T o2)

     

    方法二:实现comparable

    写ompareTo()函数

     

    复合继承原则(CRP

    • 复合复用原则(CRP):类应当通过它们之间的组合(通过包含其它类的实例来实现期望的功能)达到多态表现和代码复用,而不仅仅是从基础类或父类继承。 
    • 我们可以将组合(Composition)理解为(has a)而继承理解为(is a)
    • 例子:

     

     

     

    四种deletion方式:

    • 临时性委派(Dependency):最简单的方法,调用类里的方法(use a),其中一个类使用另一个类而不实际地将其作为属性。
    • 永久性委派(Association):类之中有其它类的具体实例来作为一个变量(has a
    • 更强的委派,组合(Composition):更强的委派。将一些简单的对象组合成一个更为复杂的对象。(is part of
    • 聚合(Aggregation:对象是在类的外部生成的,然后作为一个参数传入到类的内部构造器。(has a)

     

    框架:

    框架分为白盒框架和黑盒框架。 

    • 白盒框架: 
      • 通过子类化和重写方法进行扩展(使用继承); 
      • 通用设计模式:模板方法; 
      • 子类具有主要方法但对框架进行控制。
    • 黑盒框架: 
      • 通过实现插件接口进行扩展(使用组合/委派); 
      • 常用设计模式:Strategy, Observer  
      • 插件加载机制加载插件并对框架进行控制。
  • 相关阅读:
    第4月第1天 makefile automake
    第3月30天 UIImage imageWithContentsOfFile卡顿 Can't add self as subview MPMoviePlayerControlle rcrash
    第3月第27天 uitableviewcell复用
    learning uboot fstype command
    learning uboot part command
    linux command dialog
    linux command curl and sha256sum implement download verification package
    learning shell script prompt to run with superuser privileges (4)
    learning shell get script absolute path (3)
    learning shell args handing key=value example (2)
  • 原文地址:https://www.cnblogs.com/masteryellow/p/9214312.html
Copyright © 2011-2022 走看看