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

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

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

动机:

一开始继承了一个类,随后发现超类中的许多操作并不真正适用于子类。这种情况下,你所拥有的接口并未真正反映出子类的功能。你可能发现你从超类中继承了一大堆子类并不需要的数据,抑或你可能发现超类中的某些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();
}




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值