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

我试图拥有一个Race由我的蚂蚁实现为通用的抽象超类,以便我可以访问蚂蚁的“移动速度”等属性。对于不同的种族,我将创建扩展类Race,显然我想赋予每个Race不同的属性。“移动速度”需要以Race某种方式保持静态,这样我就可以通过类而不是对象的实例来访问它们,但它不能是静态的,因为这样对于所有种族来说都是相同的。我需要一种方法来规避这个问题,因为我的整个程序结构都依赖于它。


我不能Race成为 的超类,Ant因为我有Ant类似Drone或 的子类Queen,并且它们应该可供所有种族访问。


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;

    }

}

当我这样尝试时,对于所有种族来说都是一样的,尽管不应该如此。


aluckdog
浏览 104回答 1
1回答

料青山看我应如是

“移动速度”在比赛中需要以某种方式保持静态,这样我就可以按班级访问它们一点也不。被认为static是良好的 OOP 设计中的异常,尤其是在 Java 中。OOP 的方式是这样的:public abstract class Race {&nbsp; 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> {&nbsp; &nbsp;protected final R rInstance;&nbsp; &nbsp;protected BaseAnt(R rInstance) { this.R rInstance = R rInstance; }&nbsp; &nbsp;public final double move(double distance) {&nbsp; &nbsp; &nbsp; return distance / Instance.getSpeed();&nbsp; &nbsp;}public class Ant<R extends Race> {&nbsp; ctor that calls super constructor进而public enum Race {&nbsp; DRONE(5), QUEEN(1);&nbsp; private final double speed;&nbsp; private Race(double speed) { this.speed = speed; }&nbsp; public double getSpeed() { return speed; }换句话说:您可以使用充当“常量提供者”的枚举。您可以在 Race.DRONE 上调用getSpeed();然后你就回来了5。然后您可以使用 Race.DRONE 或 Race.QUEEN 实例化 Ant。另一方面,BaseAnt 类为 Ant 执行所有“常见”操作,然后您的子类添加特定的行为。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java