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.
- 1. Sens „Nie można zmniejszyć widoczność odziedziczonej metody” z interfejsem
- 2. android getMenuInflater() w podklasie fragmentu - nie można rozwiązać metody
- 3. Dlaczego nie można zawęzić zakresu metody podczas przesłaniania
- 4. Sprawdzanie widoczności metody w PHP
- 5. Przeciążenie metody w podklasie w C++
- 6. Wywołanie metody klasy bazowej z metody przeciążonej w podklasie
- 7. Zastępowanie @jsonIgnore w podklasie
- 8. Dlaczego -Xrs zmniejszyć wydajność
- 9. Dlaczego nie można wywołać metody Policy?
- 10. Java: nie można uzyskać dostępu do chronionego członka nadklasy w rozszerzającej podklasie
- 11. Java zmniejszyć zużycie procesora
- 12. Dlaczego można przekazać wartość zerową do przeciążonej metody Java?
- 13. dlaczego nie możemy przypisać słabszego przywileju w podklasie
- 14. Dlaczego nie mogę zmniejszyć szerokości mojego przycisku?
- 15. Dlaczego nie można wywołać metody chronionej z klasy dziedziczącej w innym pakiecie w języku Java?
- 16. Dlaczego Java nie ma metody putIfAbsent (klucz, dostawca) w Mapie?
- 17. Dlaczego nie można użyć metody prywatnej w lambda?
- 18. UnsupportedOperationException - Dlaczego nie można wywołać metody toInstant() w java.sql.Date?
- 19. Dlaczego w nadpisywaniu metody java można mieć kowariantne typy zwracania, ale nie parametry kowariantne?
- 20. Jak zmniejszyć rozmiar pliku obrazu w java
- 21. można zmniejszyć zawartość elementu iframe?
- 22. Dlaczego wywołanie metody Java jest tak kosztowne?
- 23. touchesBegan nie jest wywoływana w podklasie UIView
- 24. Nie można wybrać odpowiedniej metody za pomocą Java Generics
- 25. android java onClick Nie można wykonać metody działania
- 26. Dlaczego Stream nie miał metody toList()?
- 27. INotifyPropertyChanged w podklasie
- 28. Dlaczego "nie można użyć obiektu jako parametru do metody"?
- 29. Które klasy nie mogą być poddane podklasie?
- 30. JPA Dziedziczenie wymaga ID w podklasie
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