2017-02-04 21 views
1

私はJavaで何かをモデリングし、Builderパターンを使用しています。多くの場合、いくつかの一般的なメンバーが親に定義されており、親から継承した子メンバーのメンバーが追加されています。次のように例を示します。継承と静的ネストされたJavaクラス

public class Parent { 
    private Integer age; 

    static class ParentBuilder { 
     private Integer age; 

     public ParentBuilder age(Integer age) { 
      this.age = age; 
      return this; 
     } 
    } 
} 

public class Child extends Parent { 

    private Integer height; 

    static class ChildBuilder extends Parent.ParentBuilder { 
     private Integer height; 

     public ChildBuilder height(Integer height) { 
      this.height = height; 
      return this; 
     } 

     public Child build() { 
      return new Child(this); 
     } 
    } 

    public static ChildBuilder builder() { 
     return new ChildBuilder(); 
    } 

    public Child(ChildBuilder b) { 
     this.height = b.height; 
    } 
} 

私は

Child child = Child.builder() 
    .age(18) 
    .height(150) 
    .build(); 

ような何かをしようとした場合、私はコンパイル時にエラーが出ます:

Main.java:6: error: cannot find symbol 
     .height(150) 
     ^
symbol: method height(int) 
location: class ParentBuilder 

.height(150)を削除すると.build()で同じエラーが発生しました。私は静的なネストされたクラスで継承を根本的に誤解しているようです。

Child.builder()ChildBuilderを返した場合、そのメソッドがParentBuilderにないと不平を言っているのはなぜですか?このビルダーパターンと一緒に継承を活用して、共通のメンバーを親や他の子に定義できるようにしようとしているので、この作業を行う方法はありますか?

+4

ためChildBuilderを返します、したがって、なぜcomplationエラーがあります'height'を呼び出そうとしています。 http://stackoverflow.com/questions/21086417/builder-pattern-and-inheritanceまたはhttp://stackoverflow.com/questions/17164375/subclassing-a-java-builder-class – Tunaki

+0

私は 'Integer 'の代わりに' int'の代わりに 'int'の代わりに' null:null 'でもよいかb)選択肢がない場合 –

+0

ここでは[tag:inner-classes]はありません。 – EJP

答えて

1

あなたはこの方法でageそれはジェネリック

static class ParentBuilder<B extends ParentBuilder<B>> { 
    public B age(Integer age) { 
     this.age = age; 
     return (B) this; 
    } 
} 

static class ChildBuilder extends Parent.ParentBuilder<ChildBuilder> { 
    private Integer height; 

    public ChildBuilder height(Integer height) { 
     this.height = height; 
     return this; 
    } 

    public Child build() { 
     return new Child(this); 
    } 
} 

で動作させることができますそれは、 `` ParentBuilder`を返すage`あるChildBuilder

+0

ありがとう、@ Tunakiのリンクと私はそれを持っていると思う。しかし、 'this'を(B)にキャストするか' getThis() 'パターンを使う必要があります。 – razor

+0

@razorはい。あなたはキャストが必要です。答えを更新しました。 –

関連する問題