查看下面的代码。似乎有更简单的方法来做到这一点。
对于我要添加到系统的每个新Class
,我必须执行以下操作才能设置类变量(static - > 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;
}
我认为这样做是不正确的。
答案 0 :(得分:11)
首先,你不应该为你的班级Class
命名(即使是例子)。选择一个更好的名字。
其次,看起来enum就像你真正需要的那样:
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;
}
}
答案 1 :(得分: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
替换为enum
或类似内容。
另一种方式:
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;
}
}