是否可以使用多态中的超类对象访问子类的变量

时间:2010-04-07 14:27:49

标签: polymorphism subclass superclass

如何使用类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);
        }
    }
}

2 个答案:

答案 0 :(得分: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();

答案 1 :(得分:-2)

这是不可能的。

但你可以采取行:

public KalaGameState state;

并将其放在类KalaPlayer的定义中。 这假设KalaPlayer的每个子类都应该具有自身的状态。

然后,您仍然可以在构造函数中为您正在创建的每个实例设置状态。

所以这更像是一个设计问题,而不是语言问题,因为你的超类应该包含所有子类共有的所有信息。