关于代码复用中委派的意义

在学习软件构造这门课程之前,对于代码复用这个问题,我所了解的最多的就是类的继承。


类的继承是面向对象语言的三大特征(继承,封装,多态)之一。它是实现软件复用的重要手段。


而不同于C++语言的多继承,在Java语言中继承具有单继承的特点, 即每个子类只有一个直接父类。子类继承自父类, 将获得父类的全部成员变量和方法,这样就很好的复用了父类的代码。

委派也是一种提高代码复用性的手段。它让一个对象请求另一个对象的功能,获得一个操作并将其发送到另一个对象。


但是,我们为什么要使用委派?它相对于继承的优势区间在哪里?经过课程的学习,我对这些问题有了一些理解:


委派的机制如下:当一个类要使用其他类的方法的时候,不一定需要通过继承实现,而是在自己的类中加入一个其他类的对象的成员变量,这样一来该类的对象就相当于拥有其它类的对象的方法。也就是说,委派应该在一个类的对象要使用其它类的方法时使用。

但仅仅知道委派的使用场合不足以说明委派的意义。因为按照上面的说法,委派能实现的,继承一样可以实现,如果一个类想要使用另外一个类的方法,只需要让这个类继承另一个类就可以了。


考虑这样一个情景:当前需要设计一个类A,它想使用类B中的方法a而不需要使用B中的其它方法,而在类B中,有方法a,b,c,d,e,f,g等大量方法,如果直接让A继承自B,那么A将拥有B的全部方法。然而A其实只需要B中的一个方法a,可能会导致类A实现一些原本不想被实现的功能,改变A的性质。继承确实提高了代码的重用性,但是也破坏了类的封装性。父类中的代码对子类来说可见了(除了private的属性和方法),很可能会使得程序出现漏洞。

这时候,委派的重要性就体现出来了。
此时我们可以在A中添加一个类型为B的成员变量,当需要使用a方法时,直接调用该成员变量对象的a方法即可,这样就避免了继承导致的B中方法全部被添加到A中的问题。

在Java语言已经写好的常用系统类中,就有类似的委派使用:如栈类Stack和有序集合类List,Stack和List有着相似之处:栈有弹出栈顶元素和向栈中压入元素操作,而有序集合类有向集合中加入元素和删除元素操作。我们都知道,数据结构栈应该只支持操作栈顶元素,如果直接让Stack类继承List的全部方法,会导致栈类可以直接操作栈中任意位置的元素,这就改变了栈的性质。因此可以使用委派操作,借助List的add操作实现Stack的push操作,借助List的remove操作,实现Stack的pop操作,这样就避免了“栈”不再是栈的问题。

除此之外,如果一味的使用继承而不是用委派操作,可能会使得一个较大的项目中的类继承关系十分复杂,这并不是我们想要看到的。此时合理地使用委派可以降低继承树的高度和宽度,使各类之间的复用关系更加简单,清晰,也更不易出错。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值