【发布时间】:2013-06-28 06:02:42
【问题描述】:
忽略使变量protected 很方便这一事实,是否有任何东西实际上需要protected 的存在?
【问题讨论】:
-
您可以拥有必须由您的类的子类实现的
public void init() { basicInit(); }和abstract protected void basicInit()(仅作为示例)。
标签: java
忽略使变量protected 很方便这一事实,是否有任何东西实际上需要protected 的存在?
【问题讨论】:
public void init() { basicInit(); } 和abstract protected void basicInit()(仅作为示例)。
标签: java
即使您使用 getter 和 setter(我个人会使用 - 我几乎总是将字段保密),但这并不意味着 protected 变得毫无意义......这只是意味着您可能会使用 getter 和设置者自己 protected 而不是变量。
如果您的问题真的是关于 protected 可访问性是否有用,我会说是 - 拥有一个只能由子类访问的成员通常是有意义的。不仅如此,我有时会使用一个受保护的抽象方法,该方法由超类调用,但在层次结构之外无法访问。
例如,在模板方法模式中,您可能有一个公共方法,它会进行一些设置,调用受保护的抽象方法,然后可能还会进行一些最终工作。您不想公开抽象方法,因为您想确保执行开始/结束代码......并且您不想强制子类显式调用该代码。
【讨论】:
假设您要创建一个包含可变燃料的类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(...) 方法来做同样的事情。
【讨论】:
protected 属性可以标记为abstract,也可以标记为virtual 并被覆盖。使用变量而不是属性可以防止这种情况,并强制派生类直接使用基类的实现。
【讨论】: