1 回答
TA贡献1772条经验 获得超8个赞
“移动速度”在比赛中需要以某种方式保持静态,这样我就可以按班级访问它们
一点也不。被认为static是良好的 OOP 设计中的异常,尤其是在 Java 中。OOP 的方式是这样的:
public abstract class Race {
protected abstract double getIndividualSpeed();
...
然后子类(在正确的位置)@Override 提供个人速度。
但正如所说:这里的关键是你退后一步,重新思考你的设计。使用静态字段,尤其是在“多态”上下文中(几乎)是不行的。
除此之外,关于泛型的想法在这里不太适合。泛型(或多或少)是关于“包含”某些东西。当您说class Foo<T extends Bar>then 时,您表示 Foo 实例将以某种方式拥有/与 Bar 类相关。是的,是的,在某种程度上适合您的用例,但是(就我个人而言),我不确定泛型是否是正确的选择。
事实是:泛型主要是编译时的事情。在运行时, 的概念R消失了。你的班级Ant不知道你是否有
Ant<Drone> ant = new Ant...
或者
Ant<Queen> a2 = ...
换句话说:在R.speed概念上是不可能的。更加 OOP 的方法可能如下所示:
public abstract class BaseAnt<R extends Race> {
protected final R rInstance;
protected BaseAnt(R rInstance) { this.R rInstance = R rInstance; }
public final double move(double distance) {
return distance / Instance.getSpeed();
}
public class Ant<R extends Race> {
ctor that calls super constructor
进而
public enum Race {
DRONE(5), QUEEN(1);
private final double speed;
private Race(double speed) { this.speed = speed; }
public double getSpeed() { return speed; }
换句话说:您可以使用充当“常量提供者”的枚举。您可以在 Race.DRONE 上调用getSpeed();然后你就回来了5。
然后您可以使用 Race.DRONE 或 Race.QUEEN 实例化 Ant。
另一方面,BaseAnt 类为 Ant 执行所有“常见”操作,然后您的子类添加特定的行为。
添加回答
举报