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恰...
  • sinat_25682007
  • sinat_25682007
  • 2017年06月22日 09:18
  • 186

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

你在两个classes 之间使用委托关系(delegation),并经常为整个接口编写许多极简单的请托函数(delegating methods)。 让「请托(delegating)class」...
  • yuwei629
  • yuwei629
  • 2013年05月16日 09:28
  • 593

《重构 改善既有代码的设计》——学习笔记(三)

简化条件表达式Decompose Conditional(分解条件表达式)从if、then、else三个段落中分别提炼出独立函数 if (date.before(SUMMER_START) ||...
  • benhuo931115
  • benhuo931115
  • 2017年05月22日 09:37
  • 1656

设计模式与重构汇总

面向对象的基本原则: 单一原则:引起一个类发生变化的原因只有一个 开放封闭原则:对于类的修改是封闭的,而对于类的扩展是开放的 依赖倒置原则:高层不依赖于底层,都应该依赖与抽象;抽象不依赖于细节,...
  • u012613903
  • u012613903
  • 2017年05月31日 10:38
  • 532

设计模式:Inheritance(继承) 和 Delegation(委托)

设计模式:Inheritance(继承) 和 Delegation(委托) 今天继续讲Design Pattern的内容。所谓 Design Pattern,翻译过来就是设计模式,是OO语言的一些基...
  • iw1210
  • iw1210
  • 2014年06月23日 10:27
  • 3156

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

某个子类只用超类接口中的一部分,或是根本不需要继承而来的数据。 在子类中新建一个字段用以保存超类;调整子类函数,令它改而委托超类;然后去掉两者之间的继承关系 1.动机 继承是个好东西,但有时候它并...
  • sinat_25682007
  • sinat_25682007
  • 2017年06月20日 10:05
  • 154

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

某个子类只使用超类接口中的一部分,或是根本不需要继承而来的数据。 在子类中新建一个字段用以保存超类;调整子类函数,令它改而委托超类;然后去掉两者之间的继承体系。 动机: 一开始继承了一个类,随后...
  • ptn3900
  • ptn3900
  • 2011年10月19日 11:29
  • 594

Inheritance继承

public继承 维持不变 权限不变 protected继承 修改访问权限,全部变成protected 将基类中的public变成protected private继承 全部变成priva...
  • qq_28203631
  • qq_28203631
  • 2017年01月20日 09:05
  • 54

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

某个subclass 只使用superclass 接口中的一部分,或是根本不需要继承而来的数据。 在subclass 中新建一个值域用以保存superclass ;调整subclass 函数,令...
  • yuwei629
  • yuwei629
  • 2013年05月16日 09:26
  • 550

简化条件表达式之六 :Replace Conditional with Polymorphism(以多态取代条件式)

你手上有个条件式,它根据对象型别的不同而选择不同的行为。 将这个条件式的每个分支放进一个subclass 内的覆写函数中,然后将原始函数声明为抽象函数(abstract method)。 ...
  • yuwei629
  • yuwei629
  • 2013年05月07日 16:19
  • 815
收藏助手
不良信息举报
您举报文章:11.11 replace inheritance with delegation(以委托取代继承)
举报原因:
原因补充:

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