2011-07-14 2 views
4

私は、オブジェクトBが必要ですが、私は、実行時にiは物体Aを取得する 'B.GetByID()'サブクラスで同じファクトリメソッドを使用するにはどうすればよいですか?

public class A 
{ 
    public A() 
    { 

    } 

    public static A GetSelf() 
    { 
     return new A(); 
    } 

    public static A GetByID() 
    { 
     return GetSelf(); 
    } 
} 


public class B extends A 
{ 
    public B() 
    { 
     super(); 
    } 


    public static B GetSelf() 
    { 
     return new B(); 
    } 
} 


B.GetByID(); //returns A, i need B 

答えて

12

あなただけのもによってBB GetByID()メソッドを作成することを行うことができます。それは幾分醜いですが...

基本的にB.GetByID()コールはA.GetByID()に解決されます。コンパイルされたコードには、元々B.GetByID()であることが示されており、GetSelf()への呼び出しはGetByID()になり、とにかくA.GetSelf()に解決されます。

基本的に静的メソッドでは、多態性が必要な方法では許可されません。私はAFactoryBFactoryサブクラスを作成し、通常の方法でオーバーライドすることをお勧めします。インスタンスメソッドです。

1

あなたはそうのように、BGetByIDメソッドを追加することができます。

public class B ... { 

    public static B GetByID() 
    { 
     return GetSelf(); 
    } 

} 
0

あなたのファクトリメソッド(それが宣言されていたクラスに関係なく)は、両方を認識している必要があり、ABをして、決定を下しますどのクラスをインスタンス化するか。呼び出し元にBが必要であることがわかっている場合は、とにかくnew B()を実行できるため、ファクトリメソッドには値が設定されていません。

関連する問題