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

不,您不能在基类中拥有一个静态变量,该变量对每个子类具有不同的值(据我所知,这是您理想情况下想要做的)。

您这样做的方式是一种选择,另一种是使用非静态变量,如下所示。

并且您的变量最好比您的 getter 函数具有更小的范围。

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 回答