代码之家  ›  专栏  ›  技术社区  ›  Ed Marty

Java中泛型类的泛型类

  •  3
  • Ed Marty  · 技术社区  · 16 年前

    我有这样的类层次结构设置:

    public abstract class GameController
    public abstract class Game
    

    我想使用一个通用的GameController类,所以它需要特定的游戏子类,所以我把它改为:

    public abstract class GameController<GameType extends Game>
    public abstract class Game
    

    public abstract class GameController<GameType extends Game<PlayerType>, PlayerType extends Player>
    public abstract class Game<PlayerType extends Player>
    

    有没有更好的方法来解决这个问题,这样我就不必声明PlayerType两次(在GameController子类和Game子类中)?

    编辑

    GameController是一个网络类,它接收post和get请求,并将它们转换为更接近游戏所需的内容,然后一个子类(比如MyGameController)进一步转换被发布到特定游戏类(比如MyGame)的方法调用中的字节[]。代码示例:

    游戏控制器:

    public abstract class GameController<GameType extends Game<PlayerType>, PlayerType extends Player> {
        private Hashtable<String, GameType> games;
        public MultiplayerMain() {
            super();
            games = new Hashtable<String, GameType>();
        }
        protected abstract GameType createGame(InputStream in, String gameId);
        protected abstract PlayerType createPlayer(InputStream in, GameType game, String playerId);
        protected abstract byte[] gameAction(InputStream in, GameType game, PlayerType player);
    
        //Other stuff that calls createGame, createPlayer, and gameAction
    }
    

    游戏:

    public abstract class Game<PlayerType extends Player> {
        private Hashtable <String, PlayerType> players = new Hashtable<String, PlayerType>();
        public final String gameId;
        public Game (String id) {
            gameId = id;
        }
        public abstract byte[] getGameState();
        public abstract byte[] getGameState(PlayerType player);
        final PlayerType getPlayer(String userId) {
            return players.get(userId);
        }
        final void addPlayer(PlayerType player) {
            players.put(player.userId,player);
            playerAdded(player);
        }
        final void removePlayer(PlayerType player) {
            players.remove(player);
            playerRemoved(player);
        }
        protected void playerAdded(PlayerType player) {}
        protected void playerRemoved(PlayerType player) {}
    }
    

    public class MyGameController extends GameController<MyGame,MyPlaer> {
        protected MyGame createGame(InputStream in, String gameId) {
            byte[] data = getInitializationData(in);
            return new MyGame(gameId,data);
        }
    
        protected byte[] gameAction(InputStream in, MyGame game, Player player) {
            byte[] data = getData(in);
            MyGame.methodSpecificToMyGameClassBasedOnInputStream(data);
            return game.getGameState(player);
        }
    
        protected Player createPlayer(InputStream in, MyGame game, String playerId) {
            byte[] otherData = getOtherData(in,game)
            return new MyPlayer(playerId,otherData);
        }
    }
    

    我的游戏:

    public class MyGame extends Game<MyPlayer> {
    
        public MyGame(String id) {
            //...
        }
    
        public byte[] getGameState() {
            //...
        }
    
        public byte[] getGameState(Player user) {
            //...
        }
    
        public void methodSpecificToMyGameClassBasedOnInputStream(byte[] data) {
            //...
        }
    }
    
    3 回复  |  直到 16 年前
        1
  •  3
  •   Kevin    16 年前

    Player 进入 Game 游戏 进入 GameController ?

    public class Game {
        private final PlayerType playerType;
    
        public Game(PlayerType playerType) {...}
    
    }
    
    public class GameController {
        private final Game game;
    
        public GameController(Game game) {...}
    }
    
        2
  •  0
  •   Jim Kiley    16 年前

    看起来你真的把GameController的定义和Game和GameType的继承层次紧密地耦合在一起了;类似于游戏对玩家和玩家类型。我会鼓励你将这种关系更松散地结合起来;正如其他海报所暗示的那样,构图几乎可以肯定是正确的方法,因为你把它描述为“has-a”关系。

        3
  •  0
  •   ILMTitan    16 年前

    public abstract class GameController<GameType extends Game<?>>
    public abstract class Game<PlayerType extends Player>
    

    gameController.getPlayer()只能返回玩家,但您仍然可以使用gameController.getGame().getPlayer(),它将返回玩家类型。

    我同意其他人说你的模型太耦合了。感觉gameAction不应该关心它需要什么类型的游戏或玩家。