重构第十一章
11.Replace Inheritance with Delegation(以委托取代继承)
某个subclass只使用superclass接口中的一部分,或是根本不需要继承而来的数据。在subclass中新建一个值域用以保存superclass;调整subclass函数,令它改而委托superclass;然后去掉两者之间的继承关系。
Example:
class MyStack extends Vector {
public void push(Object element) {
insertElementAt(element,0);
}
public Object pop() {
Object result = firstElement();
removeElementAt(0);
return result;
}
}
End:
class MyStack {
public void push(Object element) {
_vecoter.insertElementAt(element,0);
}
public Object pop() {
Object result = _vecoter.firstElement();
_vecoter.removeElementAt(0);
return result;
}
public int size(){
return _vecoter.size();
}
public boolean isEmpty() {
return _vecoter.isEmpty();
}
private Vecoter _vecoter;
}
Conclusion:
继承是[避免重复行为]的一个强大工具。但是有的时候它并不是你需要的,会导致subclass只使用了superclass功能的一部分。
如果以委托取代继承,你可以更加清楚的表明:你只需要委托类的一部分功能。这样的成本是需要额外写出请托函数,但这新函数比较简单。
注意
重构必须在有单元测试的情况下,保证之前的功能修改后不收影响。切记!!!
网友评论