Behavioral subtyping必须要满足的条件,不包括以下__
A 子类型可以增加父类型中所没有的新方法
B 子类型override父类型的某方法,子类型方法需具备相同或更弱的post-condition
C 子类型必须要具备与父类型相同或更弱的invariants(不变量)
D 子类型override父类型的某个方法,不能比父类型方法抛出新的异常类型,但可比父类型方法抛出的异常更少
正确答案:BC
关于Behavioral subtyping的说法,不正确的是___
A 子类型override父类型某个方法,其返回值类型应该与父类型方法的返回值类型相同或者更具体(子类型)
B 子类型override父类型某个方法,其参数的类型应该与父类型方法的参数类型相同或者更具体
C 某个类是immutable的,它可以派生出一个mutable的子类(违反LSP)
D 子类型override父类型某个public方法,子类型中该方法的可见性可以为private(违反LSP)
正确答案:BCD
public class A {
public Object a (String d) {
return "";
}
}
public class B extends A {
@Override
public String a (Object d) {
return null;
}
}
该段Java代码是否能通过static type checking?
A 能
B 不能
正确答案:B
(虽然方法a在类A和类B里符合covariance和contra-variance,但因为Java不支持contra-variance,这里的@Override是不能成立的。)
public class A {
public Object a (String d) {
return "";
}
}
public class B extends A {
public String a (Object d) {
return null;
}
}
该段Java代码是否能通过static type checking?
A 能
B 不能
正确答案:A
(方法a在类A和类B里符合covariance和contra-variance,但因为Java不支持contra-variance,于是编译器就把B中的a方法看作了A中a方法的overload。)
关于Adapter模式的说法,正确的是___
A Adapter类可提供被复用的方法,但与Client要求的spec不吻合
B Adaptee类用于将client的请求转化为对Adapter类的方法的调用
C Adapter类和Adaptee类之间的关系是delegation(template 模式不是)
D Adapter和ITarget之间的关系是inheritance
正确答案:C
Adapter模式为何要设计一个ITarget接口,而不是由client直接请求Adapter的Request()方法?
A Client对接口编程,无需了解Adapter类
B Adapter类可能发生变化,接口隔离了该变化,不会影响client代码
C Adaptee类可能发生变化,需要隔离client与他的变化
D Client无法直接构造Adapter的实例,故需要增加接口
关于Iterator模式,不正确的是____
A 为了让你的类A具备iteration的能力,需要A实现Iterator接口
B 为了让你的类A具备iteration的能力,还需要构造一个实现Iterable接口的类作为符合A特定需求的迭代器
C Java里Iterable接口只有一个方法iterator(),它返回一个迭代器对象
D Java里Iterator接口有三个方法hasNext(), next(), remove()
正确答案:AB
(AB反了)