java - 最好更改 parent 的领域或覆盖 setter/getter ?

标签 java inheritance overriding

假设我有一个 Projectile 类,它充当我游戏中所有射弹的基类。这包含最大速度、重力系数、弹跳系数等的默认值。

public abstract class Projectile {

    protected float maxSpeed = 100.0f;
    protected float gravityCoefficient = 1.0f;
    protected float bounceCoefficient = 1.0f;
    ...

}

然后我有一堆子类,每个子类都可以选择覆盖其中一些默认值。

哪种方法更好?

<强>1。在子构造函数中设置字段值

public class Arrow {

    public Arrow(){
        super();
        maxSpeed = 200.0f;
    }

}

<强>2。让 child 覆盖 getter

public class Arrow {

    public float getMaxSpeed(){
        return 200.0f;
    }

}

我倾向于说第一种方法更好,因为这意味着可以直接访问字段而不需要任何额外的函数调用。但是,这确实意味着该值在对象创建期间设置了两次,一次由父项设置,一次由子项设置。

我在这里遗漏了什么吗?或许还有另一种方法?

最佳答案

直觉上,任何特定抛射物的最大速度在其生命周期内不太可能发生变化(即使在同一类型的不同实例可以具有不同的最大速度的情况下),因此我更倾向于它的最终领域。我也赞成将其设为 final - 除了真正的常量之外,我很少使用非私有(private)字段。

因为您有一些 Projectile 的状态(字段),我会避免让 getMaxSpeed 显示的最大速度与字段不同的混淆。

我可能会这样设计:

public abstract class Projectile {
    private final float maxSpeed;

    protected Projectile(float maxSpeed) {
        this.maxSpeed = maxSpeed;
    }

    // Only if you really need this...
    protected Projectile() {
        this(200f);
    }

    public final getMaxSpeed() {
        return maxSpeed;
    }
}

public class Arrow extends Projectile {
    public Arrow() {
        super(100f);
    }
}

重力系数和弹跳系数可以用类似的方式处理 - 或者如果所有这些确实充当“特定类型的每个实例的相同值”,您可以引入一个新类来表示这些常量,它将来自常量限制/系数的类型实例的不同状态 - 每个实例都可以最终引用该新类的实例。不幸的是,Java(以及至少一些类似的语言)并没有很好地模拟这种层次结构。总是很烦:(

关于java - 最好更改 parent 的领域或覆盖 setter/getter ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32307982/

相关文章:

java - 使用套接字服务器/客户端传输文件

java - protected 字段与 protected 方法与操作处理程序的实现接口(interface)

inheritance - F#中的类型继承

python - 具有相似主体的覆盖方法

javascript - 如何覆盖我的插件的 jQuery 全局函数?

c++ - 实现纯虚函数:时出现一些错误

java - Multi-Tenancy Web 应用程序的性能监控工具

java - 如何根据发出的事件有条件地缓冲分组的 Observable/Flux?

java - 抽屉式导航 - 错误 : failed linking file resources

c++ - 使用派生类调用父类的模板函数重载