本文主要讲几个涉及到继承方面的重构,继承一般会涉及到抽象类,接口,我们通常把有相似Func的类提取同类项,也就是抽象出接口或者抽象类;这样做的好处不言而喻,可以方便的扩展,修改,维护子类的共有方法,属性,索引等等。使用基类不仅仅是把各个子类联系起来了,更是降低了各个子类间的耦合度,再次体现了面向接口、继承编程的思想。
1.提升方法:指将方法向继承链的上层迁移的过程。
用法场景:当子类A中的一个方法需要被多个子类调用的时候,需要把这个方法提升到基类中,而不能让其它的子类都去Call子类A中的这个方法。这样做唯一的缺点是扩充了基类的接口、增加了其复杂性,因此需谨慎使用。只有当一个以上的子类需要使用该方法时才需要进行迁移。
2.下放方法:指将方法向继承链的下层迁移的过程。
用法场景:此重构和上面的方法正好相反,当基类中的某个方法只需要被一个或少数几个子类实现的时候,可以考虑把基类中的方法下放到适合的子类中,避免引起不必要的混淆。
3.提升属性:指将属性向继承链的上层迁移的过程。
用法场景:和上移方法类似,这里只不过把方法改成了属性,把大多数子类需要用的属性提升到基类中。
4.下放属性:指将属性向继承链的下层迁移的过程。
用法场景:和提升属性的方法正好相反,把只有个别子类需要用到的属性下放。
下面为对这四种重构方法的代码演示。
![ContractedBlock.gif](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![ExpandedBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
{
public string Driver { get ; set ;} // 提升属性:所有的交通工具都有驾驶员
public void Turn()
{
// 提升方法:所有的交通工具都可以转向
}
}
public class Car : Vehicle
{
}
public class Plane : Vehicle
{
public void Fly()
{
// 下放方法:只有飞机才可以飞
}
}
public class Ship : Vehicle
{
public string Anchor { get ; set ; } // 下放属性:只有船才有锚
}
注意,在这里所有的方法和类,都可以在子类中使用new 关键字重新描述,合理的放置继承中方法,属性,字段的位置是个非常重要的重构方法,简单好用:)