我已经阅读了 Effective Java 中的第 16 条,并且 更喜欢组合而不是继承?现在尝试将它应用到 1 年前编写的代码中,那时我已经开始了解 Java。
我正在尝试模拟一种动物,它可以具有特征,即游泳、食肉等,并获得不同类型的食物。
public class Animal {
private final List<Trait> traits = new ArrayList<Trait>();
private final List<Food> eatenFood = new ArrayList<Food>();
}
在第 16 条中,建议使用组合转发可重用方法:
public class ForwardingSet<E> implements Set<E> {
private final Set<E> s;
public ForwardingSet(Set<E> s) {this.s = s;}
//implement all interface methods
public void clear() {s.clear();}
//and so on
}
public class InstrumentedSet<E> extends ForwardingSet<E> {
//counter for how many elements have been added since set was created
}
我可以实现ForwardingList<E>
,但我不确定如何在Animal
课堂上应用两次。现在,Animal
我有很多方法,例如下面的 fortraits
和 for eatenFood
。这对我来说似乎很尴尬。
public boolean addTrait (Trait trait) {
return traits.add(trait);
}
public boolean removeTrait (Trait trait) {
return traits.remove(trait);
}
你将如何重新设计
Animal
课程?我应该保持原样还是尝试申请
ForwardingList
?