Penso che probabilmente ha fatto una scelta sbagliata di denominazione: Penserei RestrictedUser
sarebbe una sottoclasse di User
, non il contrario, quindi userò UnrestrictedUser
come sottoclasse.
Se si esegue l'upcast di un UnrestrictedUser
a un RestrictedUser
, il proprio riferimento sarà in grado di accedere solo ai metodi dichiarati in RestrictedUser
. Tuttavia, se lo ritrasferisci a un UnrestrictedUser
, avrai accesso a tutti i metodi. Poiché gli oggetti Java sanno che tipo sono realmente, tutto ciò che in realtà è un UnrestrictedUser
può essere sempre ricondotto a esso, indipendentemente dal tipo di riferimento che si sta utilizzando (anche uno Object
). C'è una parte inevitabile e parte della lingua. Tuttavia, potresti nasconderlo dietro una sorta di proxy, ma nel tuo caso questo probabilmente sconfigge lo scopo.
Inoltre, in Java, tutti i metodi non statici sono virtuali per impostazione predefinita.Ciò significa che se UnrestrictedUser
esegue l'override di un metodo dichiarato in RestrictedUser
, verrà utilizzata la versione UnrestrictedUser
, anche se l'accesso avviene tramite un riferimento RestrictedUser
. Se è necessario richiamare la versione della classe genitore, è possibile effettuare una chiamata non virtuale chiamando lo RestrictedUser.variableName.someMethod()
. Tuttavia, probabilmente non dovresti usarlo molto spesso (il minimo dei motivi è che rompe l'incapsulamento).
Penso che tu possa essere chiaro che cos'è la base e il super qui. Le risposte sembrano confuse. Sarebbe ragionevole avere l'utente limitato la classe base dal momento che può fare di meno. Intuitivamente però, ti troverai nei guai in questo modo dato che in inglese "RestrictedUser" suona più Specializzato che solo Utente. – Hugo
Cosa stai cercando di ottenere comunque? Perché vuoi "nascondere" i metodi della sottoclasse? –