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 執行所有“常見”操作,然后您的子類添加特定的行為。
添加回答
舉報