3

複数の子パブリック静的クラスを持つ親パブリック抽象クラスが必要です。Weapon クラスのインスタンスが 1 つだけ必要です。Bow、Sword< などのいくつかの静的クラスは、親を拡張し、1 つのインスタンスにしか存在できません (少なくとも静的フィールドを取得できる必要があります)。適切に行う方法は?

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 );。親抽象を介して子にアクセスできないということですか?

4

9 に答える 9

3

このモデルを絶対に実装する必要がある場合は、ネストを検討しています。

public abstract  class Weapon {

    public static class Bow extends  Weapon { 
          static String type = "Bow ";
          static  int hitPointsTaken = 10;
    }
}
于 2012-04-13T21:52:26.700 に答える
2

Java では、ネストされたクラスのみを静的にすることができます。インスタンスが 1 つしかない場合に本当にやりたいことは、Singleton パターンを使用することです: http://en.wikipedia.org/wiki/Singleton_pattern#Example

于 2012-04-13T21:48:45.593 に答える
2

親クラスのスコープ外で public static クラスを宣言することはできません。このようにしてみてください

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

    public static class Sword extends Test{

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

        }

    }
}

Weapon クラスのコンストラクターをプライベートとして作成し、 getInstance() メソッドを使用してクラスの単一のインスタンスを作成することで、1 つのインスタンスを実現できます。これはシングルトン パターンとして知られていますが、テストや将来の変更のためにコードを書くのが難しくなるため、設計が本当に必要な場合はシングルトンにしてください。

于 2012-04-13T21:58:02.530 に答える
1

Bow クラスの 1 つのインスタンスに静的にアクセスする場合は、Bow クラスに非パブリック コンストラクターを持たせ、そのパブリック静的インスタンスを初期化できます。( public static Bow THE_BOW = new Bow(...);) これにより、静的および継承の欲求が処理されます。これが意味をなさない場合はお知らせください。コード例を提供します。

于 2012-04-13T21:52:43.707 に答える
1

Objectが 1 つのインスタンスにしか存在できない場合 (つまり、倉庫に剣が 1 つしかない場合)、それはそれが静的な Class である必要があるという意味ではありませ。それはまだオブジェクトである必要があります。宇宙の出来事で親友の鍛冶屋が明日無料でくれるとしたらSword?あなたならどうしますか?

于 2012-04-13T21:47:18.697 に答える
1

static キーワードの意味を理解していないと思います。私はJavaが初めてなので、自分で調べなければなりませんでした。(それが、私がこのサイトを頻繁に閲覧する理由の 1 つです... 私も多くのことを学びます)。私はこれを見つけました: Secrets of Static in Java with Example site in my bookmarks. static キーワードを詳細に説明しています。あなたのプロジェクトで頑張ってください。

于 2012-04-13T21:57:05.263 に答える
0

それを行う最善の方法は、「クラスの武器」にシングルトン パターンを使用することです。

コンストラクターを非公開にし、 getInstance() メソッドを使用して Weapon インスタンスを取得します。この後、弓と剣のサブクラスを作成します。

于 2013-03-25T05:24:21.733 に答える
0

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;
  }
}
于 2012-04-14T20:32:28.270 に答える