13、面向对象编程中的继承与组合技术

面向对象编程中的继承与组合技术

1. 编写可继承代码

1.1 识别反模式

在编写代码时,有两种反模式表明代码可能从继承中受益:
- 使用类型变量判断消息发送 :当一个对象使用类似 type category 的变量来决定向自身发送什么消息时,意味着存在两种高度相关但略有不同的类型。这种代码维护起来很困难,每次添加新类型都需要修改代码。可以通过将公共代码放在抽象超类中,并为不同类型创建子类来使用经典继承。这样,通过添加新子类可以创建新的子类型,而无需更改现有代码。
- 检查接收对象的类来决定消息发送 :当发送对象检查接收对象的类以决定发送什么消息时,说明忽略了鸭子类型。这同样是维护的噩梦,每次引入新的接收类都需要修改代码。在这种情况下,所有可能的接收对象都扮演着共同的角色,应将这个角色定义为鸭子类型,接收者应实现鸭子类型的接口。实现后,原对象可以向每个接收者发送单一消息,因为每个接收者都扮演该角色,所以能理解这个共同消息。此外,鸭子类型除了共享接口,还可能共享行为,此时可将共享代码放在模块中,并在扮演该角色的每个类或对象中包含该模块。

1.2 坚持抽象原则

抽象超类中的所有代码应适用于继承它的每个类,超类不应包含只适用于部分子类的代码。这一限制也适用于模块,模块中的代码必须适用于所有使用它的对象。错误的抽象会导致继承对象包含不正确的行为,试图解决这些错误行为会使代码质量下降。当子类重写方法以抛出 “未实现” 异常时,就是这个问题的症状。尽管有时这样安排代码最具成本效益,但应尽量避免。如果无法正确识

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值