亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

抽象超類中靜態變量的替代方案

抽象超類中靜態變量的替代方案

aluckdog 2023-07-28 16:49:35
我試圖擁有一個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;    }}當我這樣嘗試時,對于所有種族來說都是一樣的,盡管不應該如此。
查看完整描述

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


查看完整回答
反對 回復 2023-07-28
  • 1 回答
  • 0 關注
  • 131 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號