6

忽略制作变量可能很方便的事实protected,是否有任何实际需要存在的东西protected

4

3 回答 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 回答