2017-03-26 7 views
0

Iは構造下記た:第一の方法としてそれを使用するとき私はspecialConfigMehthod1を使用することができこれにはどんなデザインパターンがありますか? (ビルダー、継承)

public class MyClass { 

    public static class DefaultBuilder { 
     private int config1; 
     private String config2; 

     public DefaultBuilder configMethod1(int config1){ 
      this.config1 = config1; 
      return this; 
     } 

     public DefaultBuilder configMethod2(String config2){ 
      this.config2 = config2; 
      return this; 
     } 
    } 

    public static class SpecialBuilder extends DefaultBuilder { 
     private long specialConfig1; 

     public SpecialBuilder specialConfigMethod1(long specialConfig1){ 
      this.specialConfig1 = specialConfig1; 
      return this; 
     } 

    } 
} 

... 

public class Main { 

    public static void main(String[] args){ 
     new MyClass.DefaultBuilder().configMethod1(1).configMethod2("Test"); // Works great 
     new MyClass.SpecialBuilder().specialConfigMethod1(10).configMethod1(1).configMethod2("Test"); // Works great 
     new MyClass.SpecialBuilder().configMethod1(1).configMethod2("Test").specialConfigMethod1(10); // Does not work 
    } 
} 

を。しかし、これは図書館のAPIでなければならないので、私は彼に電話を注文する方法を伝えたくありません。さらに、DefaultBuilderを使用しているときに、specialConfigMethod1()に電話することはできません。私はSpecialBuilderのすべてのメソッドをオーバーライドすることができますが、継承が無意味なので、私はそのソリューションが嫌いです。私はまた、インターフェイスについて考えているが、そこに良い解決策は見つかりませんでした。 (Javaの場合は可能です:) :)

これを実際の例で見る場合は、ここに行くことができます:GitHub これは私の最初のオープンソースです私はAPIを好きではありません。

答えて

0

I)が最善のアプローチは、メソッドconfigMethod1(と、最初のインターフェイスビルダーを定義することであると思い、configMethod2()とspecialConfigMethod():

public interface Builder { 

     Builder configMethod1(int config1); 

     Builder configMethod2(String config2); 

     Builder specialConfigMethod1(long specialConfig1); 

} 

次にあなたが定義する抽象クラスAbstractBuilderを定義することができますインタフェース内のメソッドのいくつかのデフォルト実装。

public abstract class AbstractBuilder implements Builder{ 
     private int config1; 
     private String config2; 

     @Override 
     public Builder configMethod1(int config1){ 
      this.config1 = config1; 
      return this; 
     } 

     @Override 
     public Builder configMethod2(String config2){ 
      this.config2 = config2; 
      return this; 
     } 
    } 

そして最後に、あなたがAbsractBuilderを拡張SpecialBuilder定義:

public class SpecialBuilder extends AbstractBuilder { 
     private long specialConfig1; 

     @Override 
     public Builder specialConfigMethod1(long specialConfig1){ 
      this.specialConfig1 = specialConfig1; 
      return this; 
     } 

    } 
+0

抽象クラスの素敵なアイデアですが、私はDefaultBuilderを作成したい場合、私は最高のはこのことでしょうあなたの質問を見ていることと思います(または他のビルダー)は、常にspecialConfigMethod1を実装する必要があります。 – L3n95

+1

どのプログラミング言語を使用していますか? Javaでは、静的型が使用されるため、必要なものを作成する他の方法はありません。したがって、あなたの問題では、specialMethod1を呼び出すと、返されるオブジェクトの動的型はSpecialBuilderですが、DefaultBuilderを返します。その他のソリューションは、SpecialBuilderに以下のようにキャストできます。 new((SpecialBuilder)MyClass.SpecialBuilder()。configMethod1(1).configMethod2( "Test"))specialConfigMethod1(10); – ronce96

+0

はい私はJavaを使用しています。それはそれですが、私はそれに対処しなければなりません。ご回答有難うございます。 – L3n95

関連する問題