2010-11-26 19 views
1

que je fais un jeu d'échecs et chaque pièce a une sous-classe - roi, la reine, Rook etcComment puis-je définir un constructeur pour toutes les sous-classes

Chaque pièce a un attribut playerId que je veux mettre comme ceci:

public abstract class Piece { 

    private int playerId; 

    public Piece(int playerId) { 
     this.playerId = playerId; 
    } 
} 

Mais cela ne fonctionne que si j'instancie Piece directement (ce que je ne peux pas, parce que c'est abstrait). Est-il possible de faire en sorte que ce constructeur s'applique à toutes les sous-classes, sans avoir à l'implémenter manuellement dans chaque classe?

Répondre

1

Il n'y a pas de manière simple. Dans chacun des descendants écrire quelque chose comme ceci:

public Rook(int playerId) { 
    super(playerId); 
} 
1

Habituellement, votre IDE peut le faire pour vous. Lorsque vous étendez Piece, il devrait offrir d'ajouter tous les constructeurs dont vous avez besoin. Il doit encore être fait, mais évite d'avoir à le faire manuellement.

Vous pouvez peut-être éviter de sous-classer la pièce en séparant son comportement des pièces.

enum PieceType { 
    KING, QUEEN, ROOK; 
} 

public class Piece { 
    private final PieceType pieceType; 
    private final String playerId; 
    public Piece ... // one constructor for all. 
} 
+0

C'est une bonne idée, mais chaque pièce a d'autres attributs que je dois gérer. Je vais écrire les constructeurs dans chaque classe: P – Matt

+0

@matt, si vous utilisez un IDE, vous ne devriez vraiment pas besoin de le faire. Pouvez-vous donner des exemples d'autres attributs que vous devez gérer? Vous pouvez trouver enum peut faire beaucoup plus que ce que vous attendez. –

+0

La deuxième suggestion ferait pour un design très un-OO. Je préfère avoir des méthodes polymorphes comme piece.getValidMoves() que beaucoup d'instructions switch. – prasopes

0

Une façon (comme je le fais habituellement ce) est d'avoir un constructeur de pièce protégée

public abstract class Piece { 

    private int playerId; 

    protected Piece(int playerId) { 
     this.playerId = playerId; 
    } 
} 

et pour chaque subpiece, par exemple Rook

public class Rook extends Piece { 

    public Rook(int playerId) { 
     super(playerId); 
    } 
} 

De cette façon, le constructeur de Piece est en effet à tout le monde, sauf ses descendants.

1

Vous voudrez peut-être réfléchir aux méthodes d'usine statiques.

public abstract class Piece 
{ 
    private int playerId; 

    public int getPlayerId() 
    { 
    return playerId; 
    } 

    public int setPlayerId(int playerId) 
    { 
    this.playerId = playerId; 
    } 
} 

public class King extends Piece 
{ 
    //King specific stuff in here 
} 

public class ChessFactory 
{ 
    public static King newKing(int id) 
    { 
    King king = new King(); 
    king.setId(id); 
    return king; 
    } 
}