11.6 extract subclass 提炼子类

类中的某些特性只被某些实例用到。

新建一个子类,将上面所说到的那一部分特性移到子类中。

动机:

发现类中的某些行为只被一部分实例用到,其他实例不需要它们。有时候这种行为上的差异是通过类型码区分的,此时可以使用replace type code with subclasses或replace type code with state/strategy。

extract subclass一旦对象创建完成,无法再更改与类型相关的行为。extract class,只需插入另一个组件就可以改变对象的行为。此外子类只能用以表现一组变化。如果你希望一个类以几种不同的方式变化,就必须使用委托。

做法:

为源类定义一个新的子类

为这个新的子类提供构造函数

=》简单办法:让子类构造函数接受与超类构造函数相同的参数,并通过super调用超类构造函数。

=》如果你希望对用户隐藏子类的存在,可使用replace constructor with factory method。

找出调用超类构造函数的所有地点。如果它们需要的是新建的子类,令它们改而调用新构造函数。

=》如果子类构造函数需要的参数和超类构造函数的参数不同,可以使用rename method修改其参数列。如果子类构造函数不需要超类构造函数的某些参数,可以使用rename method将他们去除。

逐一使用push down method和push down field将源类的特性移到子类去。

=》和extract class不同的是,先处理函数再处理数据,通常会简单一些。

=》当一个public函数被下移到子类后,你可能需要重新定义该函数的调用端的局部变量或参数类型,让它们改而调用子类中的新函数。如果忘记进行这一步骤,编译器会提醒你。

找到所有这样的字段:它们所传达的信息如今可由继承体系自身传达,以selfexcapsulate field避免直接使用这些字段,然后将它们的取值函数替换为多态常量函数。所有使用这些字段的地方都应该以replace conditional with polymorphism重构。

=》任何函数如果位于源类之外,而又使用了上述字段的访问函数,考虑以move method将它移到源类中,然后再使用replace conditional with polymorphism。



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值