
# 用委托替换继承
通过此重构，可以从继承层次结构中删除类，同时保留父类的功能。在重构过程中，会创建一个私有内部类来继承以前的超类或接口。通过新创建的内部类调用父类的选定方法。
#### 执行重构
1. 在代码编辑器中，选择要重构的类，并将光标放置在要从其继承层次结构中删除继承的类中。
2. 单击右键展示上下文菜单，选择**"重构 \> 用委托替换继承"**。
3. 在打开的**"用委托替换继承"** 对话框中选择类，其中的继承将通过内部类替换为委托。提供重构选项：
   
   - 在**"字段名称"**字段中，指定新创建的内部类的字段名称。
   
   - 在**"内部类名称"**字段中，指定新创建的内部类的名称。
   
   - 选中为**"委托组件生成Getter方法"**复选框，为新创建的内部类创建getter方法。
   
   - 在**"委托成员"** 选项中，选择要通过新创建的内部类委托的父类的成员。
     如下图所示：
     图1用委托替换继承   
     ![](https://support.huaweicloud.com/usermanual-codeartside/zh-cn_image_0000002377584389.png "点击放大") 
   
   
   
   
4. 单击**"重构"**以应用重构。
 
#### 示例
例如，用委托替换**InnerClass** 类的继承，重构后将创建一个新的内部**MyAbstractClass** 类，并通过**MyAbstractClass** 调用**print** 和**evaluate**方法。
**重构前**
"com\\refactoring\\source\\InheritanceDelegation.java"文件内容如下：
```
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();
    }
}
```
**重构后**
"com\\refactoring\\source\\InheritanceDelegation.java"文件内容如下：
```
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();
    }
}
```
