簡體   English   中英

如何定義擴展父抽象的子靜態類?

[英]How to define child static class which extends parent abstract?

我需要一個父公共抽象類,它將有多個子公共靜態類。 我只需要一個Weapon類的一個實例,一些靜態類Bow,Sword <etc,它們擴展了父類,並且也只能存在於一個實例中(至少我需要能夠得到它們的靜態類)。 怎么做得好?

public abstract  class Weapon {
    ...
}
public static class Bow extends  Weapon { 
      static String type = "Bow ";
      static  int damage = 10;
}

public static class Sword extends  Weapon { 
      static String type = "Sword";
      static int damage = 10;
}

得到錯誤:

Illegal modifier for the class Sword; only public, abstract & final are permitted

我刪除了靜態它工作:

public final class   Sword extends  Weapon { 
      static String type = "Sword";
      static int hitPointsTaken = 10;
}

我可以編譯這個System.out.println( Sword.type ); 但不是這個System.out.println( Weapon.Sword.type ); 這是否意味着我無法通過父抽象訪問孩子?

如果您必須實現此模型,那么您正在尋找嵌套:

public abstract  class Weapon {

    public static class Bow extends  Weapon { 
          static String type = "Bow ";
          static  int hitPointsTaken = 10;
    }
}

在Java中,只有嵌套類可以是靜態的,並且它並不意味着你認為它意味着什么。 如果某些事物只有一個實例,那么你真正想做的是使用Singleton模式: http//en.wikipedia.org/wiki/Singleton_pattern#Example

您不能從父類范圍聲明公共靜態類。 嘗試這樣做

public abstract class Weapon {
    public abstract void usage();

    public static class Sword extends Test{

        @Override
        public void usage() {
            // TODO Auto-generated method stub

        }

    }
}

通過將Weapon類的構造函數設置為private並使用getInstance()方法創建類的單個實例,可以實現一個實例。 這被稱為Singleton模式,但是如果你的設計確實需要其他方法,請將其設為單例,因為它會使你的代碼難以編寫測試以及將來的更改。

如果一個對象只能存在於一個實例中(即我的工作室中只有一把劍),那並不意味着它應該是一個靜態類 它應該仍然是一個對象。 如果通過一些宇宙事件你最好的朋友鐵匠會給你一個免費的Sword明天怎么辦? 那你會做什么?

如果要靜態訪問Bow類的單個實例,可以使Bow類具有非公共構造函數並初始化它的公共靜態實例。 public static Bow THE_BOW = new Bow(...); )這應該照顧你的靜態和繼承欲望。 如果這沒有意義,請告訴我,我將提供一個代碼示例。

我想你很想理解static關鍵字的含義。 我是Java的新手,所以我必須自己去查找。 (這是我瀏覽這個網站的原因之一......我也學到了很多東西)。 我發現了這個:Java中的靜態秘密,我的書簽中的示例網站詳細解釋了static關鍵字。 祝你的項目好運。

這不是enum模式嗎?

public enum Weapon {
  Bow(10),
  Sword(10);

  private int damage;

  Weapon (int damage) {
    this.damage = damage;
  }

  public int getDamage () {
    return damage;
  }
}

添加 ...或更顯着

public enum Weapon {
  Bow(10) {
    @Override
    public void strike(Warrior warrior) {
      // Inflict the normal damage.
      super.strike(warrior);
      // Sometimes also sicken.
      if ( Math.random() > .95 ) {
        warrior.sicken(Illness.ArrowInTheKnee);
      }
    }
  },
  Sword(10) {
    @Override
    public void strike(Warrior warrior) {
      // Inflict the normal damage.
      super.strike(warrior);
      // Sometimes also sicken.
      if ( Math.random() > .75 ) {
        warrior.sicken(Illness.StabInTheBack);
      }
    }
  };

  // Normal damage inflicted.
  private int damage;

  Weapon(int damage) {
    this.damage = damage;
  }

  public int getDamage() {
    return damage;
  }

  public void strike(Warrior warrior) {
    warrior.inflict(damage);
  }

  // Placeholder
  public interface Warrior {
    public void inflict(int damage);
    public void terrorise(int fear);
    public void sicken (Illness illness);
  }

  enum Illness {
    StabInTheBack,
    ArrowInTheKnee;
  }
}

最好的方法是使用Singleton模式為你的“階級武器”。

使您的構造函數私有,並使用getInstance()方法來檢索您的Weapon實例。 在此之后創建Bow和Sword的子類。

你可以使用子類作為靜態類,如下所示

public class Bow extends  Weapon {

  private static Bow object = null;

  public Bow(){
    object = this;
  }

  public static getObjectAsStatic(){
    return object;
  }

}

現在,您可以像Bow.getObjectAsStatic()一樣使用“Bow.getObjectAsStatic()”調用任何類成員.classMembers

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM