Guía de ejercicios para la prueba número 3 1. Explique los conceptos Polimorfismo Herencia Modificador final y abstract Interfaz 2. Algunas preguntas de teoría Qué es una interfaz? Cómo se implementa en JAVA una interfaz? Qué significa que una clase implementa una interfaz? Cuál es la diferencia entre una clase y un objeto? En qué consiste la herencia? Cómo se indica en JAVA que una clase hereda de otra? Qué métodos de la clase padre son visibles desde la clase hija? Qué es una clase abstracta? Si no pueden instanciarse objetos, qué sentido tiene definir una clase abstracta? Cómo se programa en JAVA una clase abstracta? Cómo se invoca desde la clase hija, un método de la clase padre? Cómo se invoca, desde la clase hija, un constructor de la clase padre? 3. Cree una jerarquía simple "figura": una clase base llamada Figura y una clases derivadas llamadas Circulo, Cuadrado, y Triangulo. En la clase base, hay que hacer una función abstracta llamada dibujar(), y sobreescribirla en las clases derivadas. Hacer un array de punteros a objetos Figura que se cree en la clase principal y llenarlo con diversas figuras, posteriormente llamar a dibujar() a través de la clase base para verificar el comportamiento de las funciones. 4. Cree una jerarquía de herencia de Roedores: Raton, Gerbo, Hamster, etc. En la clase base, proporcione los métodos que son comunes a todos los roedores, y redefina aquellos en las clases derivadas para que tengan diferentes comportamientos dependiendo del tipo específico de roedor. Cree un array de punteros a Roedor, rellenelo con distintos tipos de roedores y llame a los métodos de la clase base para ver lo que ocurre. 5. Empezando con la jerarquía anterior de Roedor, herede un HamsterAzul de Hamster, sobreescriba los métodos de la clase base y muestre que el código que llama a los métodos de clase base no necesitan cambiar para adecuarse el nuevo tipo. 6. Modifique Roedor para convertirlo en una clase base pura abstracta. 7. Escriba una clase con tres funciones sobrecargadas. Herede una nueva clase y sobreescriba una de las funciones. Cree un objeto de la clase derivada. ¿Se puede llamar a todas las funciones de la clase base a través del objeto derivado? Haga un cast de la dirección del objeto a la base. ¿Se pueden llamar a las tres funciones a través de la base? Elimine la definición sobreescrita en la clase derivada. Ahora ¿Se puede llamar a todas las funciones de la clase base a través del objeto derivado? 8. Sean las siguientes clases class Animal { public void sonido(){ System.out.println("Grunt"); } } class Muflon extends Animal { public void sonido(){ System.out.println("MOOOO!"); } public void salto() { System.out.println("hop!"); } } class Armadillo extends Animal {} class Guepardo extends Animal { public void sonido(){ System.out.println("Groar!"); } } a) Dado el siguiente programa ¿que instrucciones NO provocan un error de compilación y porque? class Test1Animal { public static void main(String[] args){ adoptaAnimal(new Armadillo()); Object o = new Armadillo(); Armadillo a1 = new Animal(); Armadillo a2 = new Muflon(); } private static void adoptaAnimal(Animal a){ System.out.println("Ven, cachorrito!"); } } b) Dado el siguiente programa ubicado al principio del código class Test2Animal{ public static void main(String[] args){ Animal a = new Armadillo(); a.sonido(); a = new Muflon(); a.sonido(); a = new Guepardo(); a.sonido(); } } I. }¿Cual es el resultado de la ejecución? II. Siguiendo las reglas de la herencia, ¿que métodos/clases debe implementar y/o modificar para que cada animal diga GRUNT? III. ¿Cómo obligar a que cada Animal tenga un salto propio? ¿Como afecta la modificación propuesta a las clases derivadas? 9. Ejecute paso a paso el siguiente codigo class TestMilpies{ public static void main(String[] args){ MilpiesEsquiador m = new MilpiesEsquiador(); } } class Milpies{ protected int numeroDePies; public Milpies(){ numeroDePies = 1000; escribePies(); } public void escribePies(){ System.out.println("Un Milpiés o Cochinilla tiene "+ numeroDePies+" pies"); } } class MilpiesEsquiador extends Milpies{ protected int numeroDePiesRotos; public MilpiesEsquiador(){ numeroDePiesRotos = 100;} public void escribePies(){ System.out.println("A un Milpiés esquiador le quedan "+ (numeroDePies - numeroDePiesRotos)+" pies"); } } 10. Crear una solución JAVA para cada ejercicio con las clases, métodos, campos y propiedades indicadas: En este ejercicio se va a trabajar con los conceptos de interfaz, herencia y clase abstracta, aplicados a una jerarquía de clases para definir figuras geométricas. Todas las clases que se definan en este ejercicio deben implementar la interfaz Figura, que se encuentra a continuación: /* Interfaz Figura */ Public interface Figura { /* Devuelve el nombre de la figura*/ Public string Nombre(); /*Calcula la superficie de la figura*/ Public double calcularArea(); /*Calcula el perímetro de la figura*/ Public double calcularPerimetro(); /*Dibujar la figura en la pantalla, en modo texto*/ Public void dibujarTxt(); } a) La primera clase a implementar representará un rectángulo y se llamará Rectángulo. Debe implementar todos los métodos de la interfaz Figura, además de tener un constructor (que reciba como parámetros las dimensiones del rectángulo), y las variables necesarias. Para representar un rectángulo, puedes utilizar dos variables enteras: su base y su altura. Por lo tanto, lo más adecuado es que el constructor tome como parámetros ambas variables. El método dibujarTxt() debe dibujar la figura en la consola de texto. Por ejemplo, un rectángulo con base 6 y altura 3 se podría mostrar como: ****** ****** ****** Para probar la clase rectángulo, debes programar una clase llamada PruebaFiguras, que en su método Main cree una instancia de la clase Rectángulo y la muestre en consola, junto con su área y perímetro. b) Un cuadrado es un rectángulo con base y altura iguales, por lo tanto cuadrado puede ser definida como clase hija de la clase rectángulo. Programe la clase cuadrado de forma tal que herede de la clase rectángulo del apartado anterior. La clase cuadrado sólo necesita un constructor que reciba un parámetro (el valor del lado), y que llame al constructor del rectángulo con los parámetros base y altura iguales. Probar esta nueva clase añadiendo el código necesario a la clase PruebaFiguras. c) Ahora vamos a definir una nueva figura: el triángulo. En la consola no podemos representar cualquier triángulo. Por lo tanto, no se puede implementar en la clase triángulo el método dibujarTxt(). Por ello, declararemos este método como abstracto y, por tanto, también la clase. El resto de los métodos sí pueden ser implementados. Por otra parte para definir un triángulo vamos a utilizar tres variables, lado1, lado2 y ángulo (ángulo que forman los dos lados anteriores). En este ejercicio debes programar todos los métodos de la clase Triángulo, excepto dibujarTxt(). Recuerda que una clase abstracta puede tener constructores, aunque no pueden instanciarse objetos. Sin embargo, a diferencia del resto de los métodos, estos constructores no se ejecutan automáticamente al crear objetos de las clases hijas. d) Implementar la clase TriánguloRectángulo. En este caso, sí se puede representar la figura en consola. Dado que la mayoría de los métodos y variables necesarios ya están implementados en la clase Triángulo, TriánguloRectángulo debe heredar de la clase anterior, añadiendo el constructor adecuado (trabajaremos con triángulo rectángulos isósceles, esto es, con los dos catetos iguales; por tanto, para representar un triángulo rectángulo sólo necesitas conocer uno de los catetos). Además debes implementar el método dibujarTxt(), que debe mostrar el triángulo de forma semejante al siguiente ejemplo (con cateto igual a 5): * ** *** **** ***** e) Mejorar la clase PruebaFiguras para que proporcione una interfaz de usuario en modo texto, que permita al usuario elegir la figura geométrica que desea pintar, solicite los parámetros adecuados para cada figura, instancia la clase y pinte la figura en consola. Utilizar el siguiente menú: 1. Crear rectángulo 2. Crear cuadrado 3. Crear triángulo 4. ver figura 5. salir Si el usuario selecciona una de las primeras opciones, deberán pedírsele los datos adecuados. Si selecciona la opción 4, se mostrarán el área y el perímetro y se dibujará la última figura creada. Debe presentarse el menú hasta que el usuario seleccione la opción Salir. No se puede seleccionar la opción 4 hasta tanto no se haya seleccionado una figura. 11. A través de la herencia implemente la clase Persona. Recuerde que independientemente de la profesión, todas las personas tienen propiedades comunes: nombre, fecha de nacimiento, género, estado civil, etc. La siguiente clasificación debe ser menos general, supongamos que dividimos a todas las personas en dos grandes clases: empleados y estudiantes (dejaremos de lado a los estudiantes que además trabajan). Lo importante es decidir qué propiedades que no hemos incluido en la clase “Persona” son exclusivas de los empleados y de los estudiantes. Por ejemplo, los ingresos por nómina son exclusivos de los empleados, la nota media del curso es exclusiva de los estudiantes. Una vez hecho eso crear dos clases derivadas de Persona: “Empleado” y “Estudiante”. Hacer una nueva clasificación, ahora de los empleados. Podemos clasificar a los empleados en ejecutivos y comerciales. De nuevo estableceremos propiedades exclusivas de cada clase y crearemos dos nuevas clases derivadas de empleado: “Ejecutivo” y “Comercial”. Cada vez creemos un objeto de cualquier tipo derivado, por ejemplo de tipo Comercial, estaremos creando un solo objeto un Comercial, un Empleado y una Persona. Nuestro programa puede tratar a ese objeto como si fuera cualquiera de esos tres tipos. Es decir, nuestro comercial, además de las propiedades como comercial, su nómina como empleado y su nombre, edad y género como persona. Persona Persona Persona Persona Persona 12. Implementar el ejercicio anterior usando interfaces y clases abstractas 13. Escriba una jerarquía con herencia para la clase cuadrilátero, trapezoide, paralelogramo, rectángulo y cuadrado. Use cuadrilátero como la clase base de la jerarquía. Haga la jerarquía con la mayor profundidad que sea posible. El dato privado de cuadrilátero debería ser el par de coordenadas para los cuatro puntos extremos del cuadrilátero. Escriba un programa que instancia los objetos de cada una de las clases en su jerarquía y salida polimórfica de dimensiones y área de cada objeto. 14. Corrija el siguiente programa dándole una solución a cada posible excepción class principalExcepcion { public static void main(String[] args){ int [] temp=new int[5]; temp[0]=1; temp[1]=-2; temp[2]=3; temp[3]=4; temp[4]=0; ejercicio.Calculo(2,3,2,0,temp); } } class ejercicio{ static void Calculo(int ind1, int ind2, int ind3, int ind4, int[]temp){ int [] temp2=new int[temp[ind1]5]; temp[ind1]=(temp[ind2]+temp[ind3])/temp[ind4]; } } Pruebe ejecutando: ejercicio.Calculo(2,3,2,8,temp); ejercicio.Calculo(2,3,2,4,temp); ejercicio.Calculo(1,3,2,0,temp); 15. Cambie el manejo de excepciones del ejercicio anterior para que sean manejadas en la clase donde se encuentra el ejecutable. 16. Indique paso a paso, lo que sucede en los programas que realizo en los ejercicios 1 y 2 (indique que valor toma cada variable y si se muestra algo en pantalla colocar que es lo que se muestra). Para comprobar si esta correcto, muestre en cada paso lo que sucede por pantalla.