Можно ли дать значение дочернему классу в родительском классе в Java? - PullRequest
2 голосов
/ 15 марта 2020

Я много искал это, но нигде не мог его найти, но если вы думаете, что его уже спрашивали, пришлите мне ссылку.

У меня есть родительский класс под названием chesspiece, и у меня есть 6 дочерних классов: пешка со значением 1, рыцарь со значением 2, епископ со значением 3, ладья со значением 5, королева со значением 9 и король со значением 1000.

У меня есть две переменные экземпляра: значение и цвет фигуры

Я хочу знать, можно ли сказать, что если у вас есть значение 1, вы принадлежите классу пешки или если у вас есть значение 2, вы принадлежите к рыцарскому классу. Итак, сейчас я делаю это с помощью метода, но он возвращает только строку и ничего более. Вот мой код:

public class ChessPiece {
    private boolean     isWhite;
    private int         value;

    public ChessPiece (boolean isWhite, int value) {
        this.isWhite = isWhite;
        this.value = value;
    }
public String getNamebyValue() {
        switch (value) {
          case 1:
            return "Pawn";
          case 2:
            return "Knight";
          case 3:
            return "Bishop";
          case 5:
            return "Rook";
          case 9:
            return "Queen";
          case 1000:
            return "King";
        }
        return null;
    } 

А вот мой дочерний класс:

public class Bishop extends ChessPiece {

    public Bishop(boolean isWhite) {
        super(isWhite, 3);

    }

Ответы [ 5 ]

3 голосов
/ 15 марта 2020

Предложение:

Шахматная фигура. java

public class ChessPiece {
    private boolean     isWhite;
    private int         value;
    private String      name;

    public ChessPiece (boolean isWhite) {
        this.isWhite = isWhite;
    }

    public String getName() { return name; }

}

Епископ. java

public class Bishop extends ChessPiece {

    public Bishop(boolean isWhite) {
        super(isWhite);
        this.name = "Bishop";
        this.value = 3;
    }
    ...
}

Другими словами, пусть «наследование классов» сделает за вас как можно больше работы.

Чтобы ответить на ваш вопрос: можно поделиться переменной между родителем и подклассами ( как показано выше).

Также возможно переопределить переменных-членов в дочернем элементе. Смотрите здесь: Переопределение переменных-членов в Java (скрытие переменных)

Все зависит от вашего дизайна - от ваших требований и от того, как вы решите их реализовать.

1 голос
/ 15 марта 2020

Вы не должны создавать шахматы для каждого типа фигуры, между ними недостаточно различий. Используйте enum вместо

public class ChessPiece {
    private boolean isWhite;
    private ChessPieceType pieceType;

    enum ChessPieceType {
        Pawn(1),
        Knight(2),
        Bishop(3),
        //...
        King(1000);

        private int value;

        private ChessPieceType(int value) { 
            this.value = value; 
        }

        public int getValue() {
            return this.value;
        }
   }

    public ChessPiece (ChessPieceType type, boolean isWhite) {
        this.pieceType = type;
        this.isWhite = isWhite;
    }

    public ChessPieceType getPieceType() {
        return this.pieceType;
    }
}

Использует

ChessPiece piece = new ChessPiece(ChessPiece.ChessPieceType.Bishop, true);
ChessPiece.ChessPieceType pieceType = piece.getPieceType();

System.out.println(pieceType); //Bishop
System.out.println(pieceType.getValue()); //3
0 голосов
/ 15 марта 2020

Если я вас правильно понял, вы можете посмотреть Шаблон проектирования фабрики , вы отправите функцию «Рецепт», чтобы создать ваш объект (в вашем случае значение) и вернуть соответствующий объект

0 голосов
/ 15 марта 2020

Вы можете сделать это, но не так, как вы это кодируете.

Я бы предложил, чтобы метод возвращал тип ChessPiece вместо String, а затем создавал экземпляр типа с помощью вызова этого метода и числа.

  public class ChessPiece {
private boolean     isWhite;
private int         value;

public ChessPiece (boolean isWhite, int value) {
    this.isWhite = isWhite;
    this.value = value;
}
public ChessPiece getNamebyValue(int value) {
    switch (value) {
      case 1:
        return new Pawn();
        break;
      case 2:
        return new Knight();
      break;
       case 3:
        return new Bishop();
        break;
      case 5:
        return new Rook();
       break;
      case 9:
        return new Queen();
       break;
      case 1000:
        return new King();
      break;
      default:
      return new ChessPiece();
      break;
    }
    return null;
} 

и затем ....

       ChessPiece cp= new getNameByValue(1000);

, который вернет объект типа King.

Кроме того, если в вашем коммутаторе нет операторов break, он будет просто возвращать последнее значение при прохождении каждого оператора до тех пор, пока не произойдет разрыв.

0 голосов
/ 15 марта 2020

В этом случае измените getNamebyValue(), как показано ниже:

public ChessPiece getNamebyValue() {
    switch (value) {
      case 1:
        return new Pawn();
      case 2:
        return new Knight();
      case 3:
        return new Bishop();
      case 5:
        return new Rook()";
      case 9:
        return new Queen();
      case 1000:
        return new King();
    }
    return null;
  }

и создайте подклассы, как показано для Bishop

...