2016-10-21 9 views
0

私は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を拡張し、以下のようにタイプ3とタイプ4のサポートを追加するClassBを書くと思った。

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

これはうまくいくと思いました。しかし、私は "を取得しました。ClassBのコンストラクタでsuper()はコンストラクタ本体の最初のステートメントでなければなりません" "エラーが発生しました。

私はthis postを読んでいます。なぜスーパー()がコンストラクタの最初のステートメントでなければならないのか理解しています。

ClassBのClassAの完全なコードを記述し、タイプ3と4のサポートを追加することで、私の使用例に対処できます。しかし、この問題の解決策があるかどうかを知りたいと思います。

+1

のための共通のメソッドを宣言するインタフェースの実装があるはずですそれはそのような疑問になると... – xenteros

答えて

0

タイプ3とタイプ4のサポートを追加する必要があります。ただし、ClassAのコードを変更することはできません。

その後ClassB合理サブクラスClassAすることはできません。サブクラスは親クラスのコンストラクタを呼び出す必要があります。インタフェースを実装し、両方

理想的

ClassAClassB(それをサブクラスかもしれない無理方法は、異なるタイプで渡すことによってClassAコンストラクタに存在するであろう)、及びアプリケーションの残りの部分は符号化されます具体的にはClassAまたはClassBではなく、そのインターフェイスを使用してください。

0

親クラスは、子クラスの初期化中に明示的または暗黙的に呼び出して初期化する必要がありますが、親クラスをタイプ3とタイプ4で初期化することはできません。 。

0

あなたは深刻な設計上の欠陥があります。

一般的にスイッチは、インターフェイス多型を使用する必要があることを示す強力な兆候です。

あなたが現在Aのコンストラクタを持っているコードは工場クラスであるべき、と私はアプリのアーキテクチャに問題があると思い各handleTypeX

関連する問題