eff java 16条

复合优先于继承

现状:经常使用复合,很少使用继承,但是对于何时使用复合何时使用继承,原则不清楚

原因:没有思考类未来可变性、超类不同实现给子类带来的问题

 

问题1:若超类修改方法,子类会不会受影响,是有概率的,

比如计数Set.

CountSet extends Set{

override

addAll(){

  count++;

  super.addAll();  

}

 

addl(){

  count++;

  super.add();  

}

} 这里调用addAll("a", "b") 结果count为4,因为addall在超类中调用了add,所以在超类中的实现我们是不知道的,要解决单一调用的问题,这里addll又掉了overid的add.

 

问题2,在子类中新增一个方法,可能以后超类也会增加,但是返回参数不一样,编译通不过

 

解决方法:使用复合 ,复合的时候,上述的super就变为了私有域变量

 

问题3. 使用继承,要限定超类(这里不讨论接口),而使用复合,可以扩展多种类

class CountSet {

public CountSet(Set set) {
this.set = set;
}

private Set set;

public void addAll() {
set.addAll(Lists.newArrayList("abc"));
}

public void add() {
System.out.println("heere");
set.add("as");
}

}可以用很多set的实现类

class CountSet2 extends HashSet{
@Override
public boolean addAll(Collection c) {
return super.addAll(c);
}

@Override
public boolean add(Object o) {
System.out.println("here");
return super.add(o);
}
} 限定死了HashSet

posted on 2015-11-08 15:37  jsy306  阅读(183)  评论(0)    收藏  举报

导航