Как получить доступ к методу дочернего класса из родительского класса? - PullRequest
1 голос
/ 24 апреля 2019

Есть много ответов о том, что это нецелесообразно, но я нашел сценарий, в котором, на мой взгляд, он полезен.Пожалуйста, поправьте меня, если я ошибаюсь, и есть лучший способ.

Я строю игру в шахматы, где отдельные фигуры наследуются от суперкласса Chesspiece:

class ChessPiece:
    def __init__(self, pos, color, num, piece):
        ...

Каждая фигураесть метод, который определяет ходы, которые он может предпринять:

class Knight(ChessPiece):
    def __init__(self, pos, color=None, num=''):
        ChessPiece.__init__(self, pos, color, num, self.__class__.__name__)


    def possible_moves(self):
        pos_moves = []

        # Up, Right (1 space, 2 spaces)
        try:
            if 1 <= self.x + 2 <= len(Config.board) and 1 <= self.y - 1 <= len(Config.board):
                if Config.board[self.x + 2][self.y - 1] == '___':
                    pos_moves.append(f'{Config.tile_convert(self.x + 2)}{Config.tile_convert(self.y - 1, True)}')

        except Exception: pass

        #Up, Left
        ...

        return pos_moves

Я бы хотел реализовать функцию move().Код для функции move() будет одинаковым для каждой фигуры, за исключением того факта, что он должен сравнивать предложенный ход с возможными ходами, которые варьируются для каждой фигуры.Я мог бы сделать move() функцию для каждого куска, но это было бы просто повторять код 6 раз.

Итак, я хотел бы определить move() в Chesspiece и ссылаться на possible_moves() каждого кускафункция.

1 Ответ

1 голос
/ 24 апреля 2019

В родительском элементе проще реализовать пустой possible_moves:

class ChessPiece:
    ...
    def possible_moves(self):
        raise NotImplementedError

    def move(self, pos):
            if pos in self.possible_moves():
            ...

Или даже вернуть пустой набор движений в родительском классе:

def possible_moves(self):
    return set()

Но я думаю, что первый лучше, поэтому он заставляет все подклассы реализовать его, чтобы быть полезным.

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