import java.util.Scanner; /** * Shows overriding inherited methods */ public class Solution { /** * Gets data from standard input */ private Scanner input = null; /** * Start the execution of the solution * @param args Command line arguments */ public static void main(String args[]) { Solution solution = new Solution(); solution.run(); } /** * Run the solution. This method is called from main() */ public void run() { // Create object to read data from standard input this.input = new Scanner(System.in); // Count university's population long count = 0; // Read people from standard input while ( this.input.hasNextLine() ) { ++count; System.out.printf("%d: ", count); // Leer el tipo de persona y crear un objeto correspondiente String tipo = this.input.nextLine(); Persona persona = crearPersona(tipo); // Si se creo un persona, leerla e imprimirla if ( persona != null ) { // Se invocara la version leer() del objeto persona y // no la version de la clase base Persona. Por ejemplo, // si se creo un Estudiante se invocara el metodo leer() // de la clase Estudiante y no la de Persona, aunque la // referencia sea de tipo Persona. Esto es polimorfismo persona.leer(this.input); // Descartar el cambio de linea this.input.nextLine(); // Imprimir esta persona para ver que se leyo bien System.out.println( persona ); } else { System.err.println("Tipo de persona desconocido: " + tipo); } } // Close the standard input this.input.close(); } /** * Dado un tipo de persona, crea un objeto acorde. * Este metodo es conocido como una fabrica de * objetos ("factory method"). Se hizo estatico porque * no requiere de una instancia de Solution. Solo depende * del string tipo recibido por parametro. * * @param tipo Uno de los siguientes "estudiante", * "profesor", "administrativo", "miscelaneo". * * @return Referencia hacia un objeto persona, o * null si el tipo de persona no es valido */ static public Persona crearPersona(String tipo) { switch ( tipo ) { // Si el tipo de persona es conocido, creamos // un objeto acorde y retornamos una referencia case "estudiante": return new Estudiante(); case "profesor": return new Profesor(); // Si no conocemos ese tipo, retornamos una // referencia nula que el invocador puede chequear default: return null; } } }