如何处理子类构造函数中的其他案例?

时间:2016-10-21 11:44:45

标签: java inheritance constructor

我有一个java类。

Class ClassA {
    ClassA(int type)
    {
        switch(type)
        {
            case 1: handleType1(); break;
            case 2: handleType2(); break;
            default: throw new IllegalArgumentException(); break;
        }
    }

    private void handleType1(){}
    private void handleType2(){}
}

现在我必须添加对类型3和类型4的支持。但是我无法修改ClassA的代码。

所以我想我会编写扩展ClassA的ClassB,并添加对type3和type4的支持,如下所示。

Class ClassB extends ClassA{
    ClassB(int type)
    {
        case 3: handleType3(); break;
        case 4: handleType4(); break;
        default:
        {
            try{
                /* To support type 1 and type 2. */
                super(type);
            } catch(IllegalArgumentException e) {
              /* Handle exception. */
            }
        } break;
    }

    private void handleType3(){}
    private void handleType4(){}
}

我认为这会奏效。但是我得到了“调用super()必须是构造函数体中的第一个语句”,这是ClassB的construcor中的错误。

我读了this post,我理解为什么super()必须是构造函数中的第一个语句。

我可以通过在ClassB中编写ClassA的完整代码并添加对类型3和4的支持来解决我的用例。但我想知道是否有更好的解决方案来解决这个问题。

3 个答案:

答案 0 :(得分:0)

  

现在我必须添加对类型3和类型4的支持。但是我无法修改ClassA的代码。

然后ClassB 无法合理地继承ClassA。子类必须调用父类构造函数。 (它可能是子类的不合理的方式是通过传入不同的类型来骗取ClassA构造函数。)

理想情况下,ClassAClassB都会实现一个接口,而应用程序的其余部分将被编码为使用该接口,而不是ClassAClassB

答案 1 :(得分:0)

父类必须在初始化子类时正确初始化(通过显式或隐式调用父类构造函数),但在您的情况下,父类不能用类型3和4初始化(也没有类型)。

答案 2 :(得分:0)

你有严重的设计缺陷。

开关通常是一个强有力的信号,表明您应该使用 interfaces polymorphism

您目前在A的构造函数中拥有的代码应位于 factory 类中,并且应该有一个接口的实现,为每个handleTypeX声明常用方法

相关问题