根据我们的教授的说法,应不惜一切代价避免使用受保护的可见性。但是,我对为什么有些疑惑。说我们有这个例子:

public abstract class Animal {

    private int maxSpeed;

    public Animal() {}

    public abstract void setMaxSpeed();

}


每个Animal具有最大速度,该速度需要稍后在子类中定义。但是,将其抛出:

public class Tutrle extends Animal {

    public Tutrle() {

    }

    @Override
    public void setMaxSpeed() {


    }

}


无法从覆盖的maxSpeed方法中访问setMaxSpeed()变量。尽管一种解决方案是通过maxSpeed类的构造函数设置Animal,但最好不要将maxSpeed变量设置为protected并让以后所有子级子类都可以访问它?

最佳答案

由于maxSpeed成员是在Animal类中定义的,因此对该类使用可以对其进行设置的非抽象方法更有意义:

public void setMaxSpeed(int maxSpeed)
{
    this.maxSpeed = maxSpeed;
}


子类(例如Turtle)可以重写此方法以添加逻辑,但是它们应调用基类来设置值。

@Override
public void setMaxSpeed(int maxSpeed)
{
    if (maxSpeed > 5)
        throw new SomeException();

    super.setMaxSpeed(maxSpeed);
}


如果setMaxSpeed()保持抽象,则对于实现此方法的每个子类来说,都有自己的maxSpeed成员会更有意义。

10-08 02:25