430 likes | 582 Views
Igor Santos Grueiro. Programación II Herencia y polimorfismo. ¿Somos capaces de crear un universo?. NO. Hay más relaciones entre clases. El 96 % del ADN de un chimpancé es igual al tuyo. Tenemos un ancestro común. o “clase padre”. Heredamos rasgos de nuestros padres.
E N D
Igor Santos Grueiro Programación IIHerencia y polimorfismo
¿Somos capaces de crear un universo?
Hay más relaciones entre clases
El 96 % del ADN de un chimpancé es igual al tuyo
Tenemos un ancestro común
o “clase padre”
Heredamos rasgos de nuestros padres
Y en java, ¿cómo se hereda?
Se heredan atributos y métodos
Una clase puede tener muchas clases hijas
Pero sólo un padre Esto es en java
La clase hija sólo puede acceder a atributos y métodos de la clase padre protectedypublic Se usará para atributos de la clase padre
protected permite el acceso a los atributos y métodos calificados como tales desde la propia clase, desde clases hijas o derivadas o desde clases del mismo paquete
publicclass Persona{ protected intdni; public intgetDni(){ return this.dni; } public voidsetDni(intdni){ this.dni = dni; } public Persona(intdni){ this.dni = dni; } }
publicclass Empleado extendsPersona{ protected intantiguedad; publicEmpleado(intdni, int ant){ super(dni); this.antiguedad = ant; } } Es el constructor de la clase padre
Todo objeto de una clase hija o derivada es un objeto de la clase padre o clase base
Todo Empleado es una Persona, por ello la siguiente asignación es valida Persona p; Empleado e = new Empleado (45829821,2); p = e;
Sin embargo, no seria correcta la asignación Persona p = new Persona(45829821); Empleado e = p; Error en tiempo de compilación
Podríamos hacer un casting… Persona p = new Persona(45829821); Empleado e = (Empleado)p; Pero fallaría en ejecución
El casting no se puede hacer de una variable de clase padre a una variable de clase hija, ni entre variables hijas de un mismo padre
Todos somos personas pero ¿hablamos igual?
Nuestro método hablar es polimórfico
El polimorfismo es la propiedad que implica que un método se comporte de diferente forma en función del tipo de clase del objeto que le llama a su ejecución
Figura Círculo Rectángulo
publicclass Figura{ protecteddoubleposX; protecteddoubleposY; public double area(){ return 0; } }
publicclass Circulo extends Figura { private double radio; public double area(){ return 3.14 * radio * radio; } }
publicclassRectanguloextends Figura { private double base; private double altura; public double area(){ return base * altura; } }
El método area de la clase Figura no estaba bien definido
Un método abstracto es aquel que se declara en la clase padre o clase base, pero se implementa en una clase hija o derivada
Toda clase que contenga un método abstracto se denomina clase abstracta Una clase hija que no redefine un método abstracto también es una clase abstracta
publicabstractclass Figura{ //... public abstract double area; }
No se pueden crear objetos de una clase abstracta Figura f = new Figura(); Error de compilación
Hay que declarar los constructores porque son utilizados por sus clases derivadas
Y, ¿si queremos saber la clase hija de un objeto de la clase padre?
Figura r = newRectangulo(3,4); if (r instanceofRectangulo){ // Hacer algo } Evalúa si r es de tipo Rectangulo
public finalclass Rombo extendsFigura{ } Indica que la clase no se puede heredar
Podemos hacer lo mismo con los métodos