【发布时间】:2015-08-31 09:28:34
【问题描述】:
假设我有一个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。让孩子覆盖 getter
public class Arrow {
public float getMaxSpeed(){
return 200.0f;
}
}
我倾向于说第一种方法更好,因为这意味着可以直接访问该字段而无需任何额外的函数调用。但是,这确实意味着该值在对象创建期间设置了两次,一次由父级设置,一次由子级设置。
我在这里遗漏了什么吗?是否有,也许,另一种方法?
【问题讨论】:
-
方法 1 是正确的方法
-
第一种方法更好。您可以观察到没有任何缺点,但是第二种方法是一种非常糟糕的做法。除了使用返回固定值的 getter 之外,您还可以使用静态类常量。
-
就我个人而言,我会将字段设为私有 - 如果可能,将设为 final - 并引入一个允许子类指定值的
Projectile构造函数。 -
为什么不使用带有 speed 参数的构造函数?
-
@JonSkeet 这里有疑问,第一种方式违反了封装原则?
标签: java inheritance overriding