2009-10-21 18 views

Odpowiedz

65

Ponieważ każde wystąpienie podklasy nadal musi być prawidłowym wystąpieniem klasy bazowej (patrz Liskov substitution principle).

Jeśli podklasa nagle utraci jedną właściwość klasy bazowej (a mianowicie na przykład metoda publiczna), wówczas nie będzie już prawidłowym substytutem dla klasy bazowej.

+2

Ale dlaczego nie wolno nam zastąpić metody chronionej i zmienić jej na prywatny? Ponieważ interfejs publiczny jest wciąż taki sam, nie łamie LSP w ten sposób. – Pacerier

+0

Interfejs publiczny nie zmienia się, ale chronione robi. Kod w klasie nadrzędnej nie ma dostępu do metod z własnego ciała i krwi :( – Elazar

1

Ponieważ podtypy muszą być użyteczne jako przykłady ich nadnaturalności.

18

Bo jeśli to było dozwolone, następująca sytuacja byłaby możliwa:

Sub Klasa dziedziczy z klasy nadrzędnej. Parent ma publiczną metodę foo, Sub sprawia, że ​​ta metoda jest prywatna. Teraz poniższy kod skompilować w porządku, bo deklarowana rodzaj bar jest nadrzędny:

Parent bar = new Sub(); 
bar.foo(); 

Jednak nie jest jasne, w jaki sposób powinno się zachowywać. Jedną z możliwości byłoby spowodowanie błędu runtime. Innym byłoby po prostu na to pozwolić, co umożliwiłoby wywołanie metody prywatnej z zewnątrz, przez rzucenie tylko do klasy rodzica. Żadna z tych alternatyw nie jest akceptowalna, więc nie jest dozwolona.

Powiązane problemy