2010-04-07 3 views
3

Comment puis-je accéder à la variable d'état de la classe KeyBoardPlayer avec un objet de classe KalaPlayer?Est-il possible d'accéder à la variable de la sous-classe en utilisant l'objet de la superclasse dans le polymorphisme

/** 
    * An abstract class representing a player in Kala. Extend this class 
    * to make your own players (e.g. human players entering moves at the keyboard 
    * or computer players with programmed strategies for making moves). 
    */ 
public abstract class KalaPlayer { 

    /** 
     * Method by which a player selects a move. 
     * @param gs The current game state 
     * @return A side pit number in the range 1-6 
     * @throws NoMoveAvailableException if all side pits for the player are empty 
     * (i.e. the game is over) 
     */ 
    public abstract int chooseMove(KalaGameState gs) throws NoMoveAvailableException; 

} 



public class KeyBoardPlayer extends KalaPlayer { 
    /** 
    * Method by which a player selects a move. 
    * @param gs The current game state 
    * @return A side pit number in the range 1-6 
    * @throws NoMoveAvailableException if all side pits for the player are empty 
    * (i.e. the game is over) 
    */ 
    public KalaGameState state; 

    public KeyBoardPlayer() { 
     System.out.println("Enter the number of stones to play with: "); 
     try { 
      BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
      int key = Integer.parseInt(br.readLine()); 
      state=new KalaGameState(key); 
      //key=player1.state.turn; 
     } catch(IOException e) { 
      System.out.println(e); 
     } 
    } 

    public int chooseMove(KalaGameState gs) throws NoMoveAvailableException{ 
     return 0; 
    } 
} 

import java.io.IOException; 
import java.io.BufferedReader; 
import java.io.InputStreamReader; 

public class KalaGame { 
    KalaPlayer player1,player2; 

    public KalaGame(KeyBoardPlayer Player1,KeyBoardPlayer Player2) { 
     //super(0); 
     player1=new KeyBoardPlayer(); 
     player2 = new KeyBoardPlayer(); 
     //player1=Player1; 
     //player2=Player2; 
     //player1.state ****how can i access the stae variable from Keyboard CLass using object from KalaPlayer 
     key=player1.state.turn; 
    } 

    public void play() { 
     System.out.println("Enter the number of stones to play with: "); 
     try { 
      BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
      int key = Integer.parseInt(br.readLine()); 
      System.out.println(key); 
      KalaGameState state=new KalaGameState(key); 
      printGame(); 
     } catch(IOException e) { 
      System.out.println(e); 
     } 
    } 
} 

Répondre

6

Vous ne pouvez pas.

Il n'y a aucun membre d'accès de capacité d'une sous-classe de son parent. S'il y avait, ce qui suit provoquerait le chaos de masse:

public class Vehicle 
{ 

} 

public class Car extends Vehicle 
{ 
    SteeringWheel _wheel = new SteeringWheel(); 

    public SteeringWheel getSteeringWheel { return _wheel; } 

    public SteeringWheel setSteeringWheel(SteeringWheel value) 
    { 
     _wheel = value; 
    } 
} 

public class Bicycle extends Vehicle 
{ 

} 

Puis:

Vehicle myVehicle = new Bicycle(); 

// This call couldn't possibly work since Bicylce has no steering wheel 
// and Vehicle isn't aware of what the type of the is/isn't. 
SteeringWheel myWheel = myVehicle.getSteeringWheel(); 
+0

Je suis un peu confus comment fonctionne le polymorphisme. J'ai la super classe KAlaPLayer et subClass Keyboard et chaque instance de keyboardplayer doit avoir une instance de KalaGAmeState. si je fais polymorphim alors KalaPlayer player1 = new KeyboardPLayer(); kalaPLayer.state ***** Lorsque l'état est l'instance de kalagamestae qui est appelée dans le constructeur de keyboardplayer. pls quelqu'un peut-il aider. – fari

-2

Il est impossible de le faire.

Mais vous pouvez prendre la ligne:

public KalaGameState state;

et le mettre dans la définition de la classe KalaPlayer. Ceci suppose que chaque sous-classe de KalaPlayer devrait avoir un état de lui-même.

Vous pouvez toujours définir l'état dans votre constructeur pour chaque instance que vous créez.

Il s'agit donc plus d'un problème de conception que d'un problème de langage car votre super-classe doit contenir toutes les informations communes à toutes les sous-classes.

+0

Thnak vous Merci beaucoup. Je suis désolé mais je suis nouveau à cela et cela a tendance à être déroutant. – fari

+0

L'héritage est une chose hiérarchique où chaque sous-classe ajoute plus d'informations à celle stockée dans la superclasse. Il est donc impossible d'accéder à des données qui ne sont pas spécifiées dans la classe elle-même. Et en déclarant les variables comme KalaPlayer vous dites au compilateur que seules les informations de KalaPlayer sont disponibles. – MKroehnert

+0

Ce serait bien d'obtenir une explication de l'un des downvoters. – MKroehnert

Questions connexes