Я некоторое время размышлял над этим вопросом объектно-ориентированного проектирования и не смог найти удовлетворительного решения, поэтому подумал, что я расскажу его здесь для некоторых мнений.
У меня есть класс Game , представляющий пошаговую настольную игру, мы можем предположить, что для целей этого вопроса он похож на Monopoly.
В моем дизайне у меня есть класс Player , содержащий метод TakeTurn .
Игра проходит по всем Player s и вызывает метод TakeTurn, чтобы выполнить все необходимые действия для завершения хода.
Я хочу, чтобы у меня было n игроков, и я могу установить произвольное количество игроков в компьютер.
Поэтому я подумал о том, чтобы иметь класс HumanPlayer и класс ComputerPlayer , оба из которых происходят от Player.
Game знает только класс Player и просто вызывает метод TakeTurn для каждого Player по очереди.
Моя проблема заключается в том, что объекты ComputerPlayer могут быть полностью автоматизированы, то есть, следуя примеру «Монополия», могут принять решение о покупке недвижимости с использованием некоторой части логики.
Теперь, с объектом HumanPlayer , он должен получить данные от реального пользователя, например, чтобы иметь возможность купить свойство, что, по-видимому, подразумевает другой интерфейс и потенциально означает, что они не должны получать
Мне не удалось найти хорошее решение проблемы, если бы класс Game не знал явных реализаций различных классов Player в явном виде.
В классе Game я всегда мог предположить, что когда-нибудь будут только люди и компьютерные игроки, и он эффективно закроет его для расширения, но это не похоже на хорошее ОО-программирование.
Любые мнения по этому вопросу будут оценены.