忽略使变量protected
变得方便的事实,是否有任何实际需要存在protected
的内容?
答案 0 :(得分:16)
即使你使用getter和setter(我个人会 - 我几乎总是将字段保密)这并不意味着protected
变得毫无意义......它只是意味着你可能会getter和setter自己protected
而不是变量。
如果您的问题确实是protected
可访问性是否有用,我会说它是 - 拥有一个只能访问子类的成员通常是有意义的。更重要的是,我有时使用受超级类调用的受保护抽象方法,但在层次结构之外无法访问。
例如,在模板方法模式中,您可能有一个公共方法可以进行一些设置,调用受保护的抽象方法,然后也可能做一些最终的工作。您不希望抽象方法是公共的,因为您希望确保执行开始/结束代码...并且您不希望强制显式地调用子类代码。
答案 1 :(得分:2)
考虑你想创建一个包含可变燃料的类car
。你不希望这个变量直接从外面设置,因为燃料的使用取决于汽车。但是,如果某人延伸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(...)
方法执行相同操作。
答案 2 :(得分:0)
protected
个属性可以标记为abstract
,也可以标记为virtual
并覆盖。使用变量而不是属性可以防止这种情况并强制派生类直接使用基类的实现。