Behavioral subtyping(行为子类型) and Liskov Substitution Principle (LSP)
Behavioral subtyping
·假设q(x)是关于T类型的对象x的一个可证明的属性,那么q(y)应该是关于S类型的对象y的可证明的,其中S是T的子类型
Java中编译器强制的规则:
1.子类型可以添加,但不能删除方法
2.具体类必须实现所有未定义的方法
3.重写方法必须返回相同的类型或子类型
4.重写方法必须接受相同的参数类型
5.重写方法不能抛出额外的异常
同样适用于指定的行为:
1.相同或更强的不变量
2.所有方法相同或更强的后置条件
3.所有方法相同或更弱的前置条件
LSP
1.子类满足相同的不变量(和附加的不变量)
2.覆盖方法启动(start)的前置条件较弱
3.覆盖方法制动(brake)的后置条件较强
Variance
型变是指当子类型关系出现在更加 复杂类型中时,如何处理新类型中的子类型关系
Three types of variance
1.Covariant(协变): Subtyping is preserved. If List is a subtype of List. 保持子类型关系
2.Contravariant(逆变): Subtyping is reversed. If List is a subtype of List. 反转了子类型关系
3.Invariant(不变): Neither List nor Listis a subtype of the other. 没有子类型关系
注·:java只支持协变
选B。由于协变,要保持子类型关系,并且
所以子类型是Double。