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


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

    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  
      • 插件加载机制加载插件并对框架进行控制。
  • 相关阅读:
    [BZOJ3105][CQOI2013]新Nim游戏
    [BZOJ4592][SHOI2015]脑洞治疗仪
    [BZOJ3551][ONTAK2010]Peaks加强版
    [BZOJ2229][ZJOI2011]最小割
    [BZOJ4519][CQOI2016]不同的最小割
    [BZOJ3532][SDOI2014]LIS
    [BZOJ2668][CQOI2012]交换棋子
    [BZOJ3504][CQOI2014]危桥
    Java抽象类
    Java方法覆盖重写
  • 原文地址:https://www.cnblogs.com/masteryellow/p/9214312.html
Copyright © 2020-2023  润新知