【发布时间】:2012-07-01 04:35:28
【问题描述】:
我有一个在超类中使用受保护字段的代码。我怎样才能避免它,因为我认为所有字段都应该是私有的?
/** "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"); }
}
【问题讨论】:
-
你可以通过改变你的想法来避免这个问题。以预期的方式使用受保护的字段并没有错。
-
能否在超类中编写一个setter和getter,然后使用super.getter方法来访问它们?
-
@MichaelMyers:感谢您的回答。但是这段代码允许同一个包中的所有类访问这个受保护的字段,这可能很危险。
-
@Logan:感谢您的回答,但所有类都可以通过 setter/getter 方法访问该字段。但我认为这个解决方案比原来的更好。