抽象超类中静态变量的替代方法



我正在尝试有一个抽象的超类Race,由我的蚂蚁作为泛型实现,以便我可以访问蚂蚁的"移动速度"等属性。对于不同的种族,我将创建扩展Race的职业,显然,我想给每个Race不同的属性。"移动速度"需要以某种方式Race静态,这样我就可以通过类而不是对象的实例来访问它们,但它不能是静态的,因为这样所有种族都是一样的。我需要一种方法来规避这个问题,因为我的整个程序结构都依赖于它。

我不能Race成为Ant的超阶级,因为我有像DroneQueen这样的Ant子类,它们应该对所有种族开放。

public abstract class Race {
public static double speed;
}
public class defaultAnt extends Race {
public static double speed = 2;
}
public abstract class Ant<R extends Race> {
public void move(){
speed = R.speed;
}
}

当我像这样尝试时,所有种族都是一样的,尽管它不应该。

">

移动速度"需要以某种方式在比赛中是静态的,所以我可以通过类访问它们

一点也不。认为static是良好的OOP设计中的异常,尤其是在Java中。OOP 的方式是这样的:

public abstract class Race {
protected abstract double getIndividualSpeed();
...

然后子类(在正确的位置(@Override以提供个人速度。

但如前所述:这里的关键是你退后一步,重新思考你的设计。使用静态字段,尤其是在"多态"上下文中(几乎(是不行的。

除此之外,关于泛型的想法,它不适合这里太好。泛型(或多或少(是关于"包含"某些东西。当你说class Foo<T extends Bar>时,你传达了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实例化蚂蚁。

另一方面,BaseAnt 类为 Ant 执行所有"常见"操作,然后您的子类添加特定行为。

最新更新