Perché non puoi ridurre la visibilità di un metodo in una sottoclasse Java?
-
05-07-2019 - |
Domanda
Perché il compilatore fornisce un messaggio di errore quando si riduce la visibilità di un metodo mentre lo si sovrascrive nella sottoclasse?
Soluzione
Perché ogni istanza della sottoclasse deve ancora essere un'istanza valida della classe base (vedi Principio di sostituzione di Liskov ).
Se la sottoclasse improvvisamente ha perso una proprietà della classe base (ad esempio un metodo pubblico), non sarebbe più un sostituto valido per la classe base.
Altri suggerimenti
Perché se ciò fosse consentito, sarebbe possibile la seguente situazione:
La classe Sub eredita dalla classe Parent. Parent ha un metodo pubblico foo
, Sub lo rende privato. Ora il seguente codice verrà compilato correttamente, poiché il tipo dichiarato di bar
è Parent:
Parent bar = new Sub();
bar.foo();
Tuttavia non è chiaro come dovrebbe comportarsi. Una possibilità potrebbe essere quella di causare un errore di runtime. Un altro sarebbe semplicemente permetterlo, il che renderebbe possibile chiamare un metodo privato dall'esterno, semplicemente trasmettendo alla classe genitore. Nessuna di queste alternative è accettabile, quindi non è consentita.
Perché i sottotipi devono essere utilizzabili come istanze del loro supertipo.