2013-02-06 14 views
6

Jestem niezaznajomiony ze słowem "podtyp" po przejrzeniu the wikipedia article.Kiedy substytucja Liskov odnosi się do podtypów, czy chodzi o klasy pochodne w kontekście C#?

Wziąłem Liskov podstawienie znaczyć, jeśli masz metodę, która zajmuje Animal, powinieneś być w stanie przejść w Cat lub Animal gdzie Cat : Animal bez jakichkolwiek niezamierzonych skutków ubocznych.

Czy to oznacza podstawienie Liskov?

+5

Tak, w zasadzie. Oczywiście zwykle * będą * możliwe do odróżnienia różnice, w przeciwnym razie nie zawracalibyśmy sobie głowy różnymi podklasami - ale dopóki wszyscy przestrzegają umowy interfejsu/klasy bazowej, a to wszystko zależy od klienta, to wszystko powinno działać. (Czułem, że jest to zbyt proste, aby dodać jako odpowiedź). –

+3

Dlaczego głosowanie na zamknięcie tego pytania jako "nie jest konstruktywne"? – ken2k

+0

Dzięki, nie byłem pewien, czy to może być odniesione do sposobu, w jaki można używać typów takich jak int/double zamiast siebie. Jeśli umieścisz go w polu odpowiedzi, mogę oznaczyć go jako odpowiedź. – NibblyPig

Odpowiedz

3

Dokładnie. Wszystko, co zabiera zwierzę, powinno być w stanie zabrać psa, kota i podklasy (rasy, jeśli chcesz). Metody będą kompatybilne.

Należy również zauważyć, że warunki wstępne nie mogą zostać wzmocnione podtypem, ani warunki pozycyjne nie mogą zostać osłabione. W przeciwnym razie mógłbyś zagnieździć się w określonym podtypie, który pękłby, ponieważ otaczający kod narzucił pewne warunki wstępne, których podklasa nie mogłaby znieść. Może to być trudne do wdrożenia w praktyce - więcej informacji znajdziesz w artykule the circle/ellipse problem.

+0

+1 dla warunków wstępnych i końcowych. Bo o to właśnie chodzi w przypadku Liskova w kontekście mocno napisanego języka. –

+0

To wygląda interesująco, czytając to teraz. Zastanawiam się, jak dokładnie łamiesz zasadę, ponieważ z powodu silnego wpisania C# nie masz dostępu do żadnych właściwości, które nie istnieją przez pomyłkę. – NibblyPig

+0

Czy powiedziałbyś, że zasada Liskov jest łamana w tej sytuacji, ponieważ 'Krąg' nie jest typem' Elipsy'? I to jest udowodnione przez 'stretchX' nie będący prawidłową operacją na' Circle'? – NibblyPig

0

Tak. Zasada substytucji Likov stwierdza, że ​​jeśli moduł programu używa klasy Base, odwołanie do klasy Base można zastąpić klasą pochodną bez wpływu na funkcjonalność modułu programu.

Powiązane problemy