Czy zasada podstawienia Liskowa dotyczy również klas implementujących interfejs?

17

LSP stwierdza, że ​​klasy powinny być substytucyjne dla ich klas podstawowych, co oznacza, że ​​klasy pochodne i podstawowe powinny być semantycznie równoważne.

Ale czy LSP ma również zastosowanie do klas implementujących interfejs? Innymi słowy, jeśli metoda interfejsu zaimplementowana przez klasę różni się semantycznie od tego, czego spodziewa się użytkownik, czy byłoby to uważane za naruszenie LSP?

użytkownik1483278
źródło
7
Tak. Dokładnie te same przyczyny i wyniki, co naruszenie LSP, jeśli jest to interfejs, klasa abstrakcyjna, klasa pełna, nie ma znaczenia. LSP polega na ustalaniu i spełnianiu oczekiwań, aby umożliwić konsumentom ogólne traktowanie twoich typów.
Jimmy Hoffa
5
Ogólnie rzecz biorąc (znam różnice, ale tutaj generalizuję) interfejsy są nieco analogiczne do klas czysto abstrakcyjnych (termin C ++), dlatego Liskov powinien mieć zastosowanie do interfejsów i klas, które je implementują.
Jesse C. Slicer
3
NB: sformułowanie LSP, które znam, mówi raczej o podtypach niż klasach pochodnych i bazowych. Zakładam, że nie bez powodu, żaden z powodów nie jest specyficzny dla dziedziczenia i stosuje się równie dobrze do każdego innego rodzaju podtypu.

Odpowiedzi:

17

jeśli metoda interfejsu zaimplementowana przez klasę różni się semantycznie od oczekiwanej przez użytkownika, czy byłoby to uważane za naruszenie LSP?

Jeśli implementacja różni się semantycznie od zachowania udokumentowanego za pomocą niezmienników interfejsu i warunków wstępnych i końcowych jego metod, odpowiedź brzmi „tak”, byłoby to naruszeniem LSP. Zasada ustanawia zasady dotyczące abstrakcji i jej realizacji, nie wymagając od strony abstrakcji obecności w formie klasy.

Jeśli jednak mówimy o tym, czego oczekują użytkownicy , odpowiedź brzmiałaby „niekoniecznie”: użytkownicy mają prawo do błędnych oczekiwań.

dasblinkenlight
źródło
„Jeśli implementacja różni się semantycznie od zachowania udokumentowanego za pomocą niezmienników interfejsu” Czy mógłbyś wyjaśnić, co rozumiesz przez „niezmienniki interfejsu”?
user1483278,
3
@ user1483278 Oto artykuł o niezmiennikach typu . Artykuł nazywa je „niezmiennikami klas”, ale opis dotyczy również interfejsów. Niezmienniki to warunki ustalane na etapie budowy i utrzymywane przez cały okres istnienia instancji. Na przykład, jeśli interfejs ma właściwość Name, której nie można ustawić null, wówczas obj.Name != nullmówi się, że jest niezmiennikiem tego interfejsu.
dasblinkenlight
1
Zazwyczaj podczas omawiania niezmienników można napisać fragment kodu, aby sprawdzić, czy niezmiennik jest podtrzymywany przez cały okres istnienia obiektu. Jednak zazwyczaj łatwiej jest werbalnie opisać niezmiennik zwykłym angielskim.
rwong