1

以下のコードを見てください。もっと簡単にできる方法があるようです。

Classシステムに追加したい新しいものごとに、クラス変数を設定するために次のことを行う必要があります (静的 -> maxPlayers)?

抽象静的変数のようなものですか?

protected abstract class Class{
        protected abstract int getMaxPlayers();

        public class Soldier extends Class{
            public static final int maxPlayers = 4;

            @Override
            protected int getMaxPlayers() {
                return Soldier.maxPlayers;
            }
        }

        public class Demoman extends Class{
            public static final int maxPlayers = 2;

            @Override
            protected int getMaxPlayers() {
                return Demoman.maxPlayers;
            }
        }
        public class Scout extends Class{
            public static final int maxPlayers = 4;

            @Override
            protected int getMaxPlayers() {
                return Scout.maxPlayers;
            }
        }
        public class Medic extends Class{
            public static final int maxPlayers = 2;

            @Override
            protected int getMaxPlayers() {
                return Medic.maxPlayers;
            }
        }
    }

このテンプレートを繰り返さなければならないのと同じです:

public static final int maxPlayers = 2;

            @Override
            protected int getMaxPlayers() {
                return Medic.maxPlayers;
            }

そして、そうするのは正しくないと思います。

4

2 に答える 2

11

まず第一に、クラスに名前を付けるべきではありませんClass(例であっても)。より適切な名前を選択してください。

次に、ここで本当に必要なのは列挙型のようです。

public enum Army {   
    SOLDIER(4),
    DEMOMAN(2),
    SCOUT(4),
    MEDIC(2);

    private final int maxPlayers;

    private Army(int maxPlayers) {
        this.maxPlayers = maxPlayers;
    }

    public int getMaxPlayers() {
        return maxPlayers;
    }
}
于 2013-08-12T14:42:41.137 に答える
0

いいえ、サブクラスごとに異なる値を持つ静的変数を基本クラスに持つことはできません (私が知る限り、これは理想的にやりたいことです)。

あなたがそれをした方法は1つのオプションであり、別の方法は以下のように非静的変数を使用することです.

また、変数のスコープは、ゲッター関数よりも小さいことが望ましいです。

class Class
{
   private final int maxPlayers;

   Class(int max)
   {
      maxPlayers = max;
   }

   public int getMaxPlayers()
   {
      return maxPlayers;
   }
}

class Soldier extends Class
{
   Soldier()
   {
      super(4);
   }
}

可読性と変更可能性を高めるために、4ここを anenumまたは類似のものに置き換えることを検討してください。

別の方法:

abstract class Class
{
   public static int MAX_PLAYERS_SOLDIER = 4,
                     MAX_PLAYERS_DEMOMAN = 2,
                     ...;

   protected abstract int getMaxPlayers();
}

class Soldier extends Class
{
   @Override
   protected int getMaxPlayers()
   {
      return MAX_PLAYERS_SOLDIER;
   }
}
于 2013-08-12T14:54:39.870 に答える