首页 > 解决方案 > 从超类构造函数获取子类

问题描述

我有一个做东西的 X 类。可以有多种 X。通常我只会为每种类型创建一个子类,但是我无法更改程序的一部分,它使用 X 构造函数声明和实例化 X。除了构造函数签名之外,我对 X 有完全的控制权。(由我无法更改的程序部分调用)

我想过为每种类型创建一个 Xcontroller,其中包含我想要覆盖的方法并存储在 X 中。有些方法需要使用 X 的超级方法,除非我弄错了,否则我不能从另一个类中调用它们。

示例代码:

class cantTouchThis{
    public static void main(String[] args){
        // Can't change this
        X x = new X("obligatory parameter");
        doThings(x);
    }

    private static void doThings(X x){
        // do stuff with X
    }
}

enum Type{
    A, B, C;
    public static Type iKnowHowToGetTheTypeTrustMe(){
        // Always return the good type for the instance
    }
}

class X extends SuperClass {
    public X(String string){
        Type type = Type.iKnowHowToGetTheTypeTrustMe();
    }

    public void a(Object one, Object two){
        switch(type){
            case A:
                super.a(one, two);
                return;
            case B:
                doOtherThings(one, two);
                return;
            case C:
                super.a(two, one);
                return;
        }
    }

    private void doOtherThigns(Object one, Object two){
        // stuff
    }
}

我宁愿将类型设为自己的类(A 类扩展 X,B 类扩展 X,C 类扩展 X)。但是我必须使用 cantTouchThis 中的代码,它总是声明一个 X 并使用 X 构造函数进行实例化。X 类有大量的 switch case,以及许多仅用于某些类型的实例变量,其余时间无用。

有没有办法让 X 构造函数改变它自己的类型并成为它的子类之一?

标签: java

解决方案


您可以使用委托。像这样的东西:

class X extends SuperClass {

    private final SuperClass delegate;

    public X(String string){
        Type type = Type.iKnowHowToGetTheTypeTrustMe();
        switch(type) {
            case A:
                delegate = new AX(string);
                break;
            case B:
                delegate = new BX(string);
                break;
            // and so on...
        }
    }

    public void a(Object one, Object two) {
        delegate.a(one,two);
    }
}

然后在 AX, BX, CX 中实现一个你喜欢的。


推荐阅读