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