更新时间:2024-04-12 GMT+08:00
用委托替换继承
通过这种重构,您可以从继承层次结构中删除类,同时保留父类的功能。在重构过程中,会创建一个私有内部类来继承以前的超类或接口。通过新创建的内部类调用父类的选定方法。
执行重构
- 在代码编辑器中,选择要重构的类,并将光标放置在要从其继承层次结构中删除继承的类中。
- 在主菜单或编辑器上下文菜单中,选择Refactor>Replace Inheritance With Delegation。
- 在打开的Replace Inheritance With Delegation对话框中,选择类,从中的继承将通过内部类替换为委托。提供重构选项:
- 在Field name字段中,指定新创建的内部类的字段名称。
- 在Inner class name字段中,指定新创建的内部类的名称。
- 选中Generate getter for delegate component复选框,为新创建的内部类创建getter方法。
- 在Delegate members选项中,选择要通过新创建的内部类委托的父类的成员。
- 单击Refactor以应用重构。
示例
例如,让我们从AbstractClass中删除InnerClass的继承。因此,将创建一个新的内部MyAbstractClass类,并通过MyAbstractClass调用print和evaluate方法。
重构前
class InheritanceDelegation { public static void main(String[] args) { InnerClass innerClass = new InnerClass(); print(innerClass); } private static void print(InnerClass innerClass) { innerClass.print(); } private static class InnerClass extends AbstractClass { public void evaluate() { } } private abstract static class AbstractClass { public void print() { System.out.println("Hello World!"); } public abstract void evaluate(); } }
重构后
class InheritanceDelegation { public static void main(String[] args) { InnerClass innerClass = new InnerClass(); print(innerClass); } private static void print(InnerClass innerClass) { innerClass.print(); } private static class InnerClass { private final MyAbstractClass abstractClass = new MyAbstractClass(); public AbstractClass getAbstractClass() { return abstractClass; } public void print() { abstractClass.print(); } public void evaluate() { abstractClass.evaluate(); } private class MyAbstractClass extends AbstractClass { public void evaluate() { } } } private abstract static class AbstractClass { public void print() { System.out.println("Hello World!"); } public abstract void evaluate(); } }
父主题: 重构