忽略制作变量可能很方便的事实protected
,是否有任何实际需要存在的东西protected
?
问问题
3484 次
3 回答
16
即使您使用 getter 和 setter(我个人会这样做 - 我几乎总是将字段保密),但这并不意味着这protected
变得毫无意义......它只是意味着您可能会自己制作 getter 和 setterprotected
而不是变量.
如果您的问题真的是关于protected
可访问性是否有用,我会说它是 - 拥有一个只能由子类访问的成员通常是有意义的。不仅如此,我有时会使用由超类调用的受保护抽象方法,但在层次结构之外无法访问。
例如,在模板方法模式中,您可能有一个公共方法,它进行一些设置,调用一个受保护的抽象方法,然后也可能完成一些最终工作。您不想公开抽象方法,因为您想确保执行开始/结束代码......并且您不想强制子类显式调用该代码。
于 2013-06-28T06:06:37.183 回答
3
考虑您要创建一个car
包含可变燃料的类。您不希望直接从外部设置此变量,因为燃料使用量取决于汽车。但是,如果有人 extends car
,他们应该能够修改它。
class Car {
protected float fuelLevel;
public float getFuel() {
return this.fuelLevel;
}
public void drive() {
this.fuelLevel -= 0.5; // fuel usage of an average car
}
}
class Ferrari extends Car {
public void drive() { // override drive method
this.fuelLevel -= 2; // obviously, a Ferrari consumes much more fuel!
}
}
你也可以用一个protected void setFuel(...)
方法来做同样的事情。
于 2013-06-28T06:14:34.423 回答
0
protected
属性可以被标记abstract
,也可以被标记virtual
和覆盖。使用变量而不是属性可以防止这种情况,并强制派生类直接使用基类的实现。
于 2013-06-28T06:07:51.610 回答