我有一个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的支持来解决我的用例。但我想知道是否有更好的解决方案来解决这个问题。
答案 0 :(得分:0)
现在我必须添加对类型3和类型4的支持。但是我无法修改ClassA的代码。
然后ClassB
无法合理地继承ClassA
。子类必须调用父类构造函数。 (它可能是子类的不合理的方式是通过传入不同的类型来骗取ClassA
构造函数。)
理想情况下,ClassA
和ClassB
都会实现一个接口,而应用程序的其余部分将被编码为使用该接口,而不是ClassA
或ClassB
。
答案 1 :(得分:0)
父类必须在初始化子类时正确初始化(通过显式或隐式调用父类构造函数),但在您的情况下,父类不能用类型3和4初始化(也没有类型)。
答案 2 :(得分:0)
你有严重的设计缺陷。
开关通常是一个强有力的信号,表明您应该使用 interfaces 和 polymorphism 。
您目前在A
的构造函数中拥有的代码应位于 factory 类中,并且应该有一个接口的实现,为每个handleTypeX
声明常用方法