11.11 replace inheritance with delegation(以委托取代继承)

原创 2011年10月19日 11:29:09

某个子类只使用超类接口中的一部分,或是根本不需要继承而来的数据。

在子类中新建一个字段用以保存超类;调整子类函数,令它改而委托超类;然后去掉两者之间的继承体系。

动机:

一开始继承了一个类,随后发现超类中的许多操作并不真正适用于子类。这种情况下,你所拥有的接口并未真正反映出子类的功能。你可能发现你从超类中继承了一大堆子类并不需要的数据,抑或你可能发现超类中的某些protected函数对子类并没有意义。

如果以委托取代继承,可以更清楚地表明,你只需要受托类的一部分功能。接口中的那一部分应该被使用,那一部分应该被忽略,完全由你主导控制。这样做的成本则是需要额外写出委托函数,但这些函数都非常简单。

做法:

在子类中新建一个字段,使其引用超类的一个实例,并将它初始化为this。

修改子类内的所有函数,让它们不再使用超类,转而使用上述那个受托字段。

去除两个类之间的继承关系,新建一个受托类的对象赋给受托字段。

针对客户端所用的每一个超类函数,为它添加一个简单的委托函数。

旧代码

class MyStack extends Vector{
    public void push(Object element){
        insertElementAt(element, 0);
    }
    public Object pop(){
        Object result = firstElement();
        removeElement(0);
        return result;
    }
}


新代码

private Vector _vector = this;
public void push(Object element){
    _vector.insertElementAt(element, 0);
}
public Object pop(){
    Object result = _vector.firstElement();
    _vector.removeElementAt(0);
    return result;
}
public int size(){
    return -vector.size();
}
public boolean isEmpty(){
    return _vector.isEmpty();
}




相关文章推荐

Replace Inheritance with Delegation(以继承取代委托)

你在两个类之间使用委托关系,并经常为整个接口编写许多极简单的委托函数。 让委托类继承受托类 1. 动机 本重构与Replace Inheritance with Delegation恰...

优先使用对象组合,而不是使用继承

先转载一个例子: 继承例子: public class MyStack extends Vector{     public void push(Object element){       ...
  • lt98289
  • lt98289
  • 2014年01月17日 17:42
  • 542

处理概括关系之十二 :Replace Delegation with Inheritance(以继承取代委托)

你在两个classes 之间使用委托关系(delegation),并经常为整个接口编写许多极简单的请托函数(delegating methods)。 让「请托(delegating)class」...

处理概括关系之十一 :Replace Inheritance with Delegation(以委托取代继承)

某个subclass 只使用superclass 接口中的一部分,或是根本不需要继承而来的数据。 在subclass 中新建一个值域用以保存superclass ;调整subclass 函数,令...

继承练习题Collection with Inheritance

AssignmentAs we all know Java is a pure obejct oriented programming language and it also provide pol...

简化函数调用之十二 :Replace Constructor with Factory Method(以「工厂函数」取代「构造函数」)

你希望在创建对象时不仅仅是对它做简单的建构动作(simple construction )。 将constructor (构造函数)替换为factory method(工厂函数)。 Emp...

重构手法30:Replace Type Code with Class (以类取代类型码)

类之中有一个数值类型码,但它并不影响类的行为。以一个新的类替换该数值类型码。 动机:在以C为基础的编程语言中,类型码或枚举值很常见。如果带着一个有意义的符号名,类型码的可读性还不错。问题在于,符...

简化条件表达式之五 :Replace Nested Conditional with Guard Clauses(以卫语句取代嵌套条件式)

函数中的条件逻辑(conditional logic)使人难以看清正常的执行路径。 使用卫语句(guard clauses)表现所有特殊情况。 double getPayAmount() ...

重构手法31:Replace Type Code with Subclass (以子类取代类型码)

重构手法31:Replace Type Code with Subclass (以子类取代类型码)   你有一个不可变的类型码,它会影响类的行为。以子类取代这个类型码。 动机...

8.2 replace data value with object(以对象取代数据值)

你有一个数据项,需要与其他数据和行为一起使用才有意义。 将数据项变为对象。 动机: 开发初期,往往决定以简单的数据项表示简单的情况。但是,随着开发的进行,可能会发现,这些简单数据项不再那么简单了...
  • ptn3900
  • ptn3900
  • 2011年10月17日 09:27
  • 329
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:11.11 replace inheritance with delegation(以委托取代继承)
举报原因:
原因补充:

(最多只允许输入30个字)