Download La Herencia Múltiple
Document related concepts
no text concepts found
Transcript
La Herencia Multiple-Interfaces 1. 2. 3. Presentación basada en: Java 2., Curso de programación. Fco. Javier Ceballos. Ed. Alfoomega&RA-MA, 2003. Apuntes del Curso Programación Orientado a Objetos. Pablo Castells. Escuela Politécnica Superior, Universidad Autonoma de Madrid. Apuntes del Curso de java. Luis Hernández y Carlos Cervigón. Facultad de Informática. Universidad Católica de Madrid. La Herencia Múltiple Es aquella en la que cada clase puede heredar métodos y variables de cualquier número de superclase. Ejemplo Compañía Japonesa Es una Fabricante de motos Es una Fabricante de motos japonesas 1 La Herencia Múltiple Lenguajes que soportan Herencia Multiple C++ CLOS Objetive-C Algunas versiones de Smalltalk Problemas de ambigüedad La propiedad referida solo está en una de las subclases padres No hay Problema a b m1(a) C a b c m1(a) m2(c) c m2(c) D A E B a d a c d m2(c) La Herencia Múltiple Problemas de ambigüedad La propiedad concreta existe en más de una superclase. Existen diferentes tipos de conflictos que pueden ocurrir Conflictos de nombres Conflictos de valores Conflictos por defecto Conflictos de dominio Conflictos de restricciones Ejemplo a b m1(a) C a m1(a) A D b a m1(a) Colisión de nombres y métodos 2 La Herencia Múltiple Resolución de conflictos [booch] La semántica del lenguaje puede considerar una colisión de nombres como ilegal y rechaza la compilación de la clase. Smalltalk y Eiffel La semántica del lenguaje puede considerar el mismo nombre introducido por clases diferentes con referencia al mismo elemento conflictivo La semántica del lenguaje puede permitir el choque, pero requiere que todas las referencias de nombres califiquen la fuente de su declaración ORIONÆ Categoriza las clases C++ (::) La Herencia Múltiple La Herencia Repetida Cuando una clase hereda de 2 ó más superclases que a su vez heredan de la misma superclase D obj = crear D obj.x obj.y x La mayoría de los lenguajes de programación no permiten la duplicación estática de la clase A y t B C D Caso (a) x y z t y z Existen excepciones A A B C D Caso (b) 3 La Herencia Múltiple La Herencia Repetida Métodos para tratar la Herencia Repetida Tratar la ocurrencia de herencia repetida como ilegal Smalltalk y Eiffel Se permite la duplicación de superclases, pero requiere el uso de nombres cualificados totalmente para referirse a los miembros de una copia específica. C++ ( class B: public B { ) ÆCaso (b) Se puede tratar referencias a la misma clase como si fueran la misma clase C++ Æ Superclases repetidas como clases base virtual Subclase nombra otra clase como su superclase y la marca como virtual, para indicar que es una clase compartida ( class B: virtual public B { ) ÆCaso (a) La Herencia Múltiple en JAVA Java no permite herencia múltiple (una clase extienda varias otras), Sin embargo, por medio de los interfaces se puede conseguir un efecto similar Una interfaz es parecido a una clase abstracta, pero sólo puede tener definidos métodos abstractos y constantes (static/final). Ni atributos ni implementaciones de métodos. Se crea igual que las clases, pero utilizando interface en lugar de class: public interface Comparable { // interfaz estándar public int compareTo(Object obj); // sin abstract } Esta interfaz define un único método, que indica si el objeto receptor es menor que el proporcionado (resultado negativo), es mayor (resultado positivo) o es igual (0 como resultado). Recuerde que Object es la clase raíz de la jerarquía. 4 Interfaces Las clases pueden implementar interfaces, asegurando que incluyen la funcionalidad descrita en la interfaz (o las interfaces). public class Persona2 implements Comparable { ... public int compareTo(Object obj) { String este = nombreCompleto().toUpperCase(); String otro = ((Persona) obj).nombreCompleto().toUpperCase(); return este.compareTo(otro); } } Persona2.java Nada impide que una clase herede de otra e implemente interfaces: public class Alumno extends Persona implements Comparable { ... Y se pueden implementar varias interfaces (separadas por comas). Interfaces:Ejemplo(1) Coleccion.java Pila.java 5 Interfaces:Ejemplo(2) Mainclase.java ¿Para qué sirve una interfaz? Una interfaz impone un protocolo de métodos a implementar Una interfaz introduce un nuevo tipo Las interfaces posibilitan la herencia múltiple en cuanto a jerarquía de tipos: Las clases que implementan la interfaz son compatibles con este tipo Una interfaz define un tipo Æ una clase puede tener múltiples supertipos Sin embargo una interfaz no tiene contenido que heredar: los métodos no tienen código las variables se heredan pero son inamovibles (son estáticas y constantes) Una interfaz no proporciona funcionalidad a un objeto, sino la posibilidad de ser objeto de la funcionalidad de otros objetos 6 La interfaz vs Clase Abstracta Si Ordenable es una clase abstracta: Obliga a derivar desde la cima de la jerarquía Obliga a definir el método menor a nivel de Persona y de ObjetoGrafico (si no, clases abstractas) Problema si Persona y Directivo son clases definidas por distintos programadores En general, siempre que sea posible y tenga sentido, mejor interfaz que clase Boolean menor ( Ordenable valor) Ordenable Pesona Empleado Directivo ¿Cuándo es posible? ¿Por qué es mejor? Detalles de las Interfaces Una interfaz puede derivar de varias otras interfaces con extends Las interfaces también pertenecen a un package Las interfaces pueden ser public o del package Los métodos implementados deben ser public en las clases que implementan las interfaces Declara f() Implementa f() Al implementar una interfaz, Pesona Empleado la clase pierde las definiciones de los métodos que coincidan con métodos definidos en sus superclases Hacer un cast de un objeto a Directivo cualquier interfaz es siempre sintácticamente legal (aunque Se pierde la puede haber error en ejecución) definición de f() dada en Persona 7 Consulta Estudiar las siguientes interfaces predefinidas y su aplicación en casos específicos: java.util.Enumeration (e.j. estudiar como se emplea en el caso de la clase Vector) java.util.Collection java.util.Map java.lang.Comparable Lecturas Subclases e Interfaces. Capitulo 10. Libro: Java 2, curso de programación Paginas 371 a la 396. 8