簡體   English   中英

這是我做的正確方法嗎? 抽象靜態變量?

[英]Is it the right way to do what Im trying? Abstract static variable?

看下面的代碼。 似乎有更簡單的方法可以做到。

對於要添加到系統中的每個新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;
            }

我認為這樣做是不正確的。

首先,您不應該為您的類命名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;
    }
}

不,您不能在基類中為每個子類都具有不同值的靜態變量(據我所知,這是您理想中要執行的操作)。

這樣做的方法是一種選擇,另一種方法是使用非靜態變量,如下所示。

並且變量最好比getter函數的作用域更小。

class Class
{
   private final int maxPlayers;

   Class(int max)
   {
      maxPlayers = max;
   }

   public int getMaxPlayers()
   {
      return maxPlayers;
   }
}

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

為了提高可讀性和可修改性,您可能需要考慮在此處用enum或類似名稱替換4

其他方式:

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;
   }
}

暫無
暫無

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

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