Я разрабатываю игру «Монополия», а также больше читаю о принципах объектно-ориентированного программирования. Я читал о LSP (принципе замещения Лискова) и обнаружил, что либо я не совсем понимаю его, либо нарушаю его и должен изменить свой дизайн.
(Просто примечание: этот проект личный и просто для развлечения, поэтому мне на самом деле все равно, насколько код удобен в сопровождении, но я просто прошу личного обучения и понимания LSP)
Позвольте мне начать с того, что я разработал до сих пор:
Класс BoardSpace
— это абстрактный базовый класс, и на каждый «вид» пространства на доске приходится по одному подклассу. Итак, у меня есть PropertySpace
, TaxSpace
, GoSpace
и т. д.
BoardSpace
содержит информацию о том, где находится поле на доске, а также абстрактный метод void Land()
, так что каждое отдельное пространство может делать что-то свое при приземлении, как и должно быть. Таким образом, когда я вызываю Land()
для текущего объекта BoardSpace
, ему не нужно заботиться или думать о чем-либо еще, и он просто делает то, что должно делать пространство. Для меня это имеет смысл и звучит как работающее решение.
Но кажется, что это противоречит LSP в том, что все эти различные Land()
переопределенные методы будут делать совершенно разные вещи, как я их и разработал.
Или я неправильно понимаю LSP? Это больше связано с тем, как Land()
"ожидается" или "описывается" работа? Который в этом случае полностью отличается для каждого места, так что все в порядке? Или это конечно нарушение и надо переделывать?
Дополнительный вопрос: будет ли это считаться «злоупотреблением» наследованием или его хорошим использованием?