Как заставить один объект использовать функции из двух разных классов? - PullRequest
0 голосов
/ 29 февраля 2020

В настоящее время я учусь работать с классами, используя шахматы в качестве проекта. И я застрял с королевой и королем. Функция «ReturnMovesList ()» должна устанавливать массив «piece» .moves в зависимости от объекта. Я уже написал сценарий для каждого куска. Сам скрипт не должен быть важным, но я включил его в кейс.

class Piece {
    constructor() {
        //not important
    }

    GetLegalMoves() {
        this.SetMoves();
        //something else
    }
}

class Rook extends Piece{
    SetMoves() {
        let legal,
            rm = [[1, 0], [-1, 0], [0, 1], [0, -1]];

        for (let i in rm) {
            let tmp = [];
            for (var step = 0; step < this.step; step++){
                legal = isLegal(pposChar, pposNum, rm[i][0], rm[i][1]);
                if (legal) {
                    tmp.push(legal);
                    pposChar += rm[i][0];
                    pposNum += rm[i][1];
                    if (isKingAttacked(legal))
                        tmp.map(n => sqsToBlock.push(n));
                } else
                    break;
            }
            tmp.map(n => this.moves.push(n));
        }
    }
}

class Bishop extends Piece {
    SetMoves() {
        let tmp = [], legal;
        for (var i = -1; i <= 1; i += 2) {
            for (var j = -1; j <= 1; j += 2) {
                tmp = [];
                let checkChar = pposChar, checkNum = pposNum;
                for (var step = 0; step < this.step; step++) {
                    legal = isLegal(checkChar, checkNum, i, j);
                    if (legal) {
                        tmp.push(legal);
                        checkChar += i;
                        checkNum += j;
                        if (isKingAttacked(legal))
                            for (var k = 0; k < tmp.length; k++)
                                sqsToBlock.push(tmp[k]);
                    } else
                        break;
                }
                for (let k = 0; k < tmp.length; k++) {
                    this.moves.push(tmp[k]);
                }
            }
        }
    }
}

class Queen extends ??? {
    //need both functions
}

Как заставить объект Queen использовать обе функции? Может я что-то в корне не так делаю?

1 Ответ

2 голосов
/ 29 февраля 2020

Вы можете применить функцию setMoves из обоих других классов:

class Queen extends Piece {
  setMoves() {
     Bishop.prototype.setMoves.call(this);
     Rook.prototype.setMoves.call(this);
   }
 }

Само множественное наследование (один класс расширяет два других класса) невозможно. Другой подход заключается в реализации различных движений в разных методах Piece или в виде отдельных функций, а затем вызове тех, которые вам нужны из реализаций setMoves.

Вот как я могу реализовать все это:

 class Board {
   pieces = [];
   isValid(x, y) { /*...*/ }
   addPiece(piece) {
      piece.board = this;
      this.pieces.push(piece);
   }
 }

 class Piece {
   static moves = [];

   validMoves() {
     return this.constructor.moves.filter(([x, y]) => this.board.isValid(x, y));
    }
 }

 class Bishop extends Piece {
   static moves = [/*...*/];

   // no reimplementation of validMoves necessary
  }

 class Queen extends Piece {
   static moves = [...Bishop.moves, /*...*/];
 }
...