2010-04-07 1 views
3

Как получить доступ к переменной состояния класса KeyBoardPlayer с объектом класса KalaPlayer?Можно ли получить доступ к переменной подкласса, используя объект суперкласса в полиморфизме

/** 
    * 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); 
     } 
    } 
} 

ответ

6

Вы не можете.

Нет доступа к функциям подкласса от его родителя. Если бы не было следующее вызовет массовый хаос:

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 
{ 

} 

Тогда:

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

Я немного смущен, как работает полиморфизм. У меня есть класс KAlaPLayer и subClass Keyboard, и каждый экземпляр keyplayer должен иметь экземпляр KalaGAmeState. if i do polymorphim then KalaPlayer player1 = new KeyboardPLayer(); kalaPLayer.state ***** Состояние является экземпляром kalagamestae, который вызывается в конструкторе клавиатуры. PLS может любой помочь. – fari

-2

Это невозможно сделать.

Но вы можете взять строку:

public KalaGameState state;

и положить его в определении класса KalaPlayer. Предполагается, что каждый подкласс KalaPlayer должен иметь само состояние.

Затем вы можете установить состояние в своем конструкторе для каждого экземпляра, который вы создаете.

Так что это скорее проблема дизайна, чем проблема с языком, потому что ваш суперкласс должен содержать всю информацию, которая является общей для всех подклассов.

+0

Thnak вы Большое спасибо. Мне жаль, но я новичок в этом, и он имеет тенденцию запутываться. – fari

+0

Наследование - это иерархическая вещь, в которой каждый подкласс добавляет дополнительную информацию к той, которая хранится в суперклассе. Поэтому невозможно получить доступ к данным, которые не указаны в самом классе. И объявив переменные как KalaPlayer, вы сообщаете компилятору, что доступна только информация из KalaPlayer. – MKroehnert

+0

Было бы неплохо получить объяснение от любого из downvoters. – MKroehnert

Смежные вопросы