文档首页/ CodeArts IDE/ 用户指南/ Java/ 重构/ 用委托替换继承
更新时间:2024-04-12 GMT+08:00
分享

用委托替换继承

通过这种重构,您可以从继承层次结构中删除类,同时保留父类的功能。在重构过程中,会创建一个私有内部类来继承以前的超类或接口。通过新创建的内部类调用父类的选定方法。

执行重构

  1. 在代码编辑器中,选择要重构的类,并将光标放置在要从其继承层次结构中删除继承的类中。
  2. 在主菜单或编辑器上下文菜单中,选择Refactor>Replace Inheritance With Delegation
  3. 在打开的Replace Inheritance With Delegation对话框中,选择类,从中的继承将通过内部类替换为委托。提供重构选项:

    • Field name字段中,指定新创建的内部类的字段名称。
    • Inner class name字段中,指定新创建的内部类的名称。
    • 选中Generate getter for delegate component复选框,为新创建的内部类创建getter方法。
    • Delegate members选项中,选择要通过新创建的内部类委托的父类的成员。

  4. 单击Refactor以应用重构。

示例

例如,让我们从AbstractClass中删除InnerClass的继承。因此,将创建一个新的内部MyAbstractClass类,并通过MyAbstractClass调用printevaluate方法。

重构前

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();
    }
}

相关文档