Dlaczego kompilator wyświetla komunikat o błędzie podczas zmniejszania widoczności metody podczas jej przesłonięcia w podklasie?Dlaczego nie można zmniejszyć widoczności metody w podklasie Java?
Odpowiedz
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.
Ponieważ podtypy muszą być użyteczne jako przykłady ich nadnaturalności.
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.
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
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