Java
W Javie nigdy nie można "ukryć" czegoś przed obiektem. Kompilator może zapomnieć o szczegółach dotyczących konkretnej instancji. (jak to jest podklasa) Debugger wie o wiele więcej niż kompilator, więc powie ci, jaki aktualny typ jest obecną instancją, która prawdopodobnie jest tym, czego doświadczasz.
OOP
To brzmi jak piszesz logiki, który musi wiedzieć, jaki rodzaj obiektu, którego używasz, który nie jest zalecany w OOP, ale często wymagane ze względów praktycznych.
Ograniczanie Przymiotniki
Jak powiedział w komentarzu na pytanie, powinno być jasne, na co jest klasą bazową tutaj. Intuicyjnie RestrictedUser powinien być podklasą User, ponieważ nazwa sugeruje bardziej wyspecjalizowany typ. (Nazwa posiadająca dodatkowy aktywny przymiotnik.) W twoim przypadku jest to wyjątkowe, ponieważ jest to przymiotnik ograniczający, który pozwoliłby ci ustawić użytkownika jako podklasę RestrictedUser całkowicie w porządku. Polecam zmianę nazwy tych dwóch na coś takiego: BasicUser/UserWithId i NonRestrictedUser, aby uniknąć przymiotnika ograniczającego, który jest tutaj mylący.
Myślę, że musicie wyjaśnić, co jest tutaj podstawą i super. Odpowiedzi wydają się zagmatwane. Byłoby uzasadnione, aby restuserUser był klasą podstawową, ponieważ może zrobić mniej. Intuicyjnie jednak wpadniesz w kłopoty w ten sposób, ponieważ w języku angielskim "RestrictedUser" brzmi bardziej wyspecjalizowany niż tylko użytkownik. – Hugo
Co i tak próbujesz osiągnąć? Dlaczego chcesz "ukryć" metody podklasy? –