¡Hola Rafael!
Según el código que has compartido;
Funcionario e = new Gerente();
e.autenticar(1234);
Entonces podemos deducir que:
- El objeto e es de tipo Funcionario, que ocupa el constructor vacío de Gerente para construirse.
- El objeto tiene acceso a los métodos del Funcionario, pero no del Gerente.
- El método autenticar es un método propio del Funcionario, por lo tanto todos los funcionarios pueden autenticarse.
Entonces, la pregunta es, ¿Cuando debe estar especificado el método autenticar en la clase Gerente?
La respuesta es, cuando no se desea que todos los Funcionarios puedan autenticarse, solo los Gerentes.
Entonces aquí nos enfrentamos a un problema de diseño, porque en este minuto todos los Funcionarios pueden autenticarse, pero es necesario que solo puedan autenticarse en el sistema los Gerentes.
Entonces el método autenticar debe extrarse de la clase Funcionario, y debe posicionarse en la clase Gerente.
Ah, pero ahora el objeto e no podrá usar el método autenticar, porque ya no es un método propio del Funcionario sino del Gerente.
Entonces necesitamos hacer un cast explícito para modificar el comportamiento del objeto desde Funcionario a Gerente, para que tenga acceso al método, de esta forma:
(Gerente) e.autenticar(1234);
Ahora si, solo los gerentes pueden autenticarse. Hemos corregido el error de diseño.
Ahora... ¿Qué pasaría si necesitamos que otros tipos de Funcionarios también puedan autenticarse, además del Gerente, por ejemplo, el Administrador, o el Developer?
Te dejaré eso como tarea.
Espero este ejemplo haya despejado algunas dudas.
¡Saludos!