2

スーパークラスで保護されたフィールドを使用するコードがあります。すべてのフィールドを非公開にする必要があると思うので、どうすれば回避できますか?

 /** "Abstract Builder" */
 abstract class PizzaBuilder {
    protected Pizza pizza;

    public Pizza getPizza() { return pizza; }
    public void createNewPizzaProduct() { pizza = new Pizza(); }

    public abstract void buildDough();
    public abstract void buildSauce();
    public abstract void buildTopping();
 }

 /** "ConcreteBuilder" */
 class HawaiianPizzaBuilder extends PizzaBuilder {
    public void buildDough()   { pizza.setDough("cross"); }
    public void buildSauce()   { pizza.setSauce("mild"); }
    public void buildTopping() { pizza.setTopping("ham+pineapple"); }
 }

 /** "ConcreteBuilder" */
 class SpicyPizzaBuilder extends PizzaBuilder {
    public void buildDough()   { pizza.setDough("pan baked"); }
    public void buildSauce()   { pizza.setSauce("hot"); }
    public void buildTopping() { pizza.setTopping("pepperoni+salami"); }
 }
4

3 に答える 3

4

getPizza()子クラスで使用します。

それで :

 public void buildDough()   { pizza.setDough("cross"); }

になる

public void buildDough()   { getPizza().setDough("cross"); }
于 2012-07-01T04:39:00.607 に答える
2

いつでもハワイアン ピザとスパイシー ピザ ビルダーを公開し、ピザ フィールドを保護することができます。

public abstract class PizzaBuilder {
    protected Pizza pizza;
    ...
 }

 /** "ConcreteBuilder" */
 public class HawaiianPizzaBuilder : PizzaBuilder {
     ...
 }

 /** "ConcreteBuilder" */
 public class SpicyPizzaBuilder : PizzaBuilder {
     ...
 }
于 2012-07-01T04:46:41.093 に答える
0

コメントに次のように返信します。

@Logan: ご回答ありがとうございます。ただし、すべてのクラスはセッター/ゲッター メソッドを介してこのフィールドにアクセスできます。しかし、この解決策は元の解決策よりも優れていると思います。

それを止めたい場合は、おそらく答えは getter メソッドの可視性を変更し、setter をまったく提供しないことです。


実際、全体的なデザインは少し奇妙に見えます。create作成したオブジェクトを返さないメソッドがあり、サブクラスのビルド メソッドを呼び出す明確な方法がありません。(おそらく、ファクトリ オブジェクトの設計パターンを「確認」する必要があります。)

このレベルで再考すると、pizza変数とそのゲッターを外部から非表示にすることができ、非表示にする必要があることが明らかになります。

于 2012-07-01T05:01:20.277 に答える