使用受保护的变量而不是getter和setter是否有任何优势?

无视protected变量的事实是否方便,是否有任何实际需要protected的存在?

即使你使用getter和setter(我个人会 – 我几乎总是将字段保密)这并不意味着protected变得毫无意义……它只是意味着你可能会让getter和setter本身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和覆盖。 使用变量而不是属性可以防止这种情况并强制派生类直接使用基类的实现。