LSP утверждает, что классы должны быть заменяемыми для их базовых классов, а это означает, что производные и базовые классы должны быть семантически эквивалентными.
Но применяется ли LSP к классам, реализующим интерфейс? Другими словами, если метод интерфейса, реализуемый классом, семантически отличается от того, что пользователь ожидает от него, будет ли это рассматриваться как нарушение LSP?
design-patterns
design-principles
liskov-substitution
user1483278
источник
источник
Ответы:
Если реализация семантически отличается от поведения, задокументированного через инварианты интерфейса и предварительные и постусловия его методов, тогда ответ «да», это будет нарушением LSP. Принцип устанавливает правила для абстракции и ее реализации, не требуя, чтобы сторона абстракции присутствовала в форме класса.
Однако, если мы говорим о том, чего ожидают пользователи , ответ будет «не обязательно»: пользователи имеют право на неверные ожидания.
источник
Name
которое нельзя установить равнымnull
, тоobj.Name != null
говорят, что он является инвариантом этого интерфейса.