2012-01-20 11 views
2

抽象コンストラクタを1つのメソッドで呼び出すことは可能ですか?それを新しいメソッドを特定のサブクラスにキャストする別のメソッドに渡すことはできますか?つまり、これは方法createSubClassNObject()が右コンストラクタでそれらを使用することができるように、配列にそれらを返す、その後、1つのメソッド内のすべての変数を取得してチェックすることですラウンドを取得する抽象コンストラクタを実行してからサブクラスにキャストする

public AbstractClass createNewAbstractClass() { 
    //do lots of checks that are the same for each sub class, 
    //including geting and checking each variable, 
    //and an exception thrown by the constructor. 
    AbstractClass abstractClassObject = new AbstractClass(var1, ...); 
    return abstractClassObject; 
} 

public SubClassOne createSubClassOneObject() { 
    SubClassOne subClassOneObject = (SubClassOne)createNewAbstractClass(var1,..); 
    return subClassOneObject; 
} 

public SubClassTwo createSubClassTwoObject() { ... 

一つの方法ですが、それは非常に乱雑に思えます。そして、それは、それぞれの作成メソッドが同じ例外を同じ方法でチェックし、同じことをしなければならないことを意味します。別のメソッドに委託しようとするべき状況のようです。

実践的な観点から私は興味があります。私は自分のコードをきれいで読みやすいものにしたいと思っていますが、理論的な観点からも、これは実際に可能ですか?答えがいいえでも、理由を説明できますか?

答えて

4

これでカップルの問題があります。

  • 抽象クラスをインスタンス化することはできませんが。抽象クラスのコンストラクタは、サブクラスのコンストラクタでのみ呼び出すことができます。
  • 親クラスが抽象型ではなくても、AbstractClassという型のインスタンスではなく、AbstractClass型のインスタンスが実際に存在するため、(SubClassOne)キャストは失敗します。

ので、残念ながら、SubClassOneを返すメソッドはAbstractClassと同じパラメータを取り、ちょうどsuper呼び出しで委任するかもしれないSubClassOneコンストラクタを呼び出す必要があります。

それぞれのファクトリメソッドでいくつかの例外処理コードを複製するのは簡単な方法ではないと思います。コンストラクタは多態性でうまくいっていません。あなたはAbstractClassを返す中央のコンストラクタを持つことができますが、呼び出すサブクラスのコンストラクタにそれを伝えるパラメータ(enum、Class、何でも)が必要です。

abstract class Cow { 
    Cow() throws Exception { 
    ... // possible exceptions 
    } 
} 

class FatCow extends Cow { 
    FatCow() throws Exception { 
    super(); 
    ... 
    } 
} 

class GreenCow extends Cow { 
    GreenCow() throws Exception { 
    super(); 
    ... 
    } 
} 

enum CowType { 
    FAT_COW, GREEN_COW; 
} 

class CowMachine { 
    static Cow makeCow(CowType type) { 
    try { 
     switch (type) { 
     case FAT_COW: 
      return new FatCow(); 
     case GREEN_COW: 
      return new GreenCow(); 
     default: 
      throw new IllegalArgumentException(); 
     } 
    } catch (Exception e) { 
     ... 
     return null; 
    } 
    } 

    static Cow makeFatCow() { 
    return (FatCow) makeCow(CowType.FAT_COW); 
    } 

    static Cow makeGreenCow() { 
    return (GreenCow) makeCow(CowType.GREEN_COW); 
    } 
} 

あなたは大きなswtich文をしたくない場合は、これは遅くなるだろうが、あなたの代わりに、Classオブジェクトを受け入れ、newInstanceを呼び出すことができます。

+0

よろしくお願いいたします。それは私の頭の中の抽象クラスを少しクリアしました - なぜ私が求めていることをすることができないのか理解していると思います。 – DenverCoder8

関連する問題