2012-07-14 14 views
9

In Java, quando sovrascrivo un metodo il compilatore disabilita qualsiasi tentativo di restringere la visibilità come un errore. Ad esempio: non è possibile sovrascrivere un metodo pubblico come protetto, mentre posso eseguire l'override di un metodo protetto come pubblico.Perché non è consentito restringere l'ambito di un metodo mentre si esegue l'override di

Sono interessato a conoscere la decisione di progettazione/il pensiero alla base di questa regola.

+0

Questa domanda è stata posta qualche giorno fa, ma quale sarebbe il punto? –

+1

http://stackoverflow.com/q/11343763/1475461 guarda questo per la discussione che si è svolta la scorsa settimana sul numero –

risposta

14

Una sottoclasse deve sempre soddisfare il contratto della superclasse. Vedi Liskov Substitution principle.

La visibilità dei metodi è parte di questo contratto. Quindi qualsiasi cosa visibile pubblicamente nella superclasse dovrebbe essere pubblica anche nella sottoclasse.

+1

risposta SOLIDA ....! –

14

Considerare una classe B che eredita da A. A.m() è pubblico. Considerare ora questo codice:

A obj = new B(); 
obj.m(); 

Questa chiamata deve essere consentita? Sì, dovrebbe, perché obj è un oggetto di tipo A! È anche un oggetto di tipo B, ma questo non è necessariamente noto a quello che utilizza l'oggetto.

Ogni oggetto del tipo A deve rispettare il contratto (interfaccia) per A. B estende A e deve quindi anche aderire a tale contratto.

3

Mentre abbiamo eliminato o implementato il livello di accesso, dovremmo raggiungere lo stesso livello di accesso o più ampio per quel livello di accesso.

private < (default) < protected < public 

Il pubblico è più ampio di livello.

In Interface tutti i membri sono pubblici di default. Quindi, durante l'implementazione o il ridding dobbiamo andare solo per pubblico.

Problemi correlati