Interfaces Agustn J Gonzlez ELO329 1 Introduccin En

  • Slides: 8
Download presentation
Interfaces Agustín J. González ELO-329 1

Interfaces Agustín J. González ELO-329 1

Introducción • En C++ se permite la herencia múltiple; es decir, es posible derivar

Introducción • En C++ se permite la herencia múltiple; es decir, es posible derivar una clase de dos o más clases bases simultáneamente. • La herencia múltiple es manejable en casos simples, pero puede llegar a ser muy compleja si datos son heredados de múltiples cases bases. • Java NO soporta múltiple herencia. • Java Sí soporta “herencia” múltiple de interfaces 2

Definición • Una interface puede ser considerada como una clase abstracta (i. e. No

Definición • Una interface puede ser considerada como una clase abstracta (i. e. No podemos crear instancias de ella) con las siguientes características: – Todos los miembros son públicos (no hay necesidad de declararlos públicos) – Todos los métodos son abstractos (no se requiere declararlos como abstract) – Todos los campos datos son static y final. Se usa para definir valores constantes. 3

Estudio vía un ejemplo • Consideremos el problema de ordenar objetos • Existen algoritmos

Estudio vía un ejemplo • Consideremos el problema de ordenar objetos • Existen algoritmos de ordenamiento que podemos usar; lamentablemente, estos algoritmos requieren de comparar e intercambiar elementos y estas operaciones son dependientes de las clases de objetos a ordenar. • No queremos definir un algoritmo de ordenamiento por cada clase de objeto a ser ordenado. • De igual forma existen muchos algoritmos de ordenamiento (Quicksort bubblesort entre otros). La idea sería definirles a todos ellos una interfaz común, es decir que todo ellos se comprometan a implementar el mismo tipo de llamado (nombre de función y parámetros). • Primero veremos el uso de interfaces para definir clases de objetos que son ordenables (es decir que se comprometen, por ejemplo, a proveer métodos para comparar e intercambiar datos). 4

Definición e Implementación de Interfaces • Definición de la Interfaz : Sorteable. java •

Definición e Implementación de Interfaces • Definición de la Interfaz : Sorteable. java • Cualquier clase que implemente esta interfaz pasa a ser un subtipo (un objeto de la clase puede tomar el lugar de la interfaz). • De esta forma es posible crear algoritmos “polimorfos” que pueden aceptar como objetos instancias de clases que implementan la interfaz. Estos algoritmos únicamente pueden relacionarse con los objetos a través de los métodos que la interfaz define, los cuales son implementados por la clase del objeto. • Implementación de la Interfaz : Int. Array , esta clase implementa la interfaz Sorteable • La clase Int. Arrar implementa todos los métodos de la interfaz y pasa a ser un proveedor concreto de los servicios prometidos por Sorteable. • Ahora objetos de tipo Int. Array pueden ser pasados como parámetros donde se espera un objeto Sorteable. • Una clase puede implementar múltiples interfaces. public class Class. X extends Class. Y implements Interface. A, Interface. B, . . { // cuerpo de la clase } 5

Uso de Interfaces • Java ya define y usa muchas interfaces; entre ellas: Runnable

Uso de Interfaces • Java ya define y usa muchas interfaces; entre ellas: Runnable para hilos, Cloneable para copia, Image. Observer/Image. Consumer para desacoplar la carga de imágenes, Transferable para copy-and-paste, y listeners para el manejo de eventos. • Una vez que la interfaz ha sido definida, se transforma en una clase para Java sobre el cual nuevos servicios pueden ser definidos. • Por ejemplo 2 (el uno fue Sortable. java), consideremos una interfaz para indicar servicios de ordenamiento. /////// Sort. Algorithm. java /////// public interface Sort. Algorithm { // sorts a in index range public void sort(Sortable a, int begin, int end); // sorts a in its entire range public void sort(Sortable a); } 6

Uso de Interfaces (cont) • Ahora podemos crear una clase que implemente esta interfaz

Uso de Interfaces (cont) • Ahora podemos crear una clase que implemente esta interfaz usando algún algoritmo de ordenamiento, por ejemplo Quicksort. java. • En esta implementación los métodos sort son polimorfos en el sentido que aceptan cualquier objeto Sorteable (en realidad objetos que son instancia de una clase que implemente Sortable). • Una vez desarrolladas estas interfaces podemos desarrollar programas que las usen. Por ejemplo veamos esta prueba Test. Sort. java • El cual al ser ejecutado genera la siguiente salida: Input array: 2, 9, -12, 8, 17, -99, 54, 3 Increasing array: -99, -12, 2, 3, 8, 9, 17, 54 Decreasing array: 54, 17, 9, 8, 3, 2, -12, -99 • Notar que podemos intercambiar algoritmos muy fácilmente por ejemplo creando otras clases como bubblesort que implemente Sort. Algorithm. 7

Extensión de Interfaces • Una interfaz puede definirse basada en varias interfaces existentes. •

Extensión de Interfaces • Una interfaz puede definirse basada en varias interfaces existentes. • Por ejemplo interface Accessible extends Readable, Writeable, Executable {. . } • Ahora una clase o interfaz puede ser un subtipo (puede tomar el lugar de) de más de una interfaz o clase. • Pueden ocurrir conflictos cuando encontramos métodos o campos con el mismo nombre. • Conflicto con métodos: Si dos métodos son exactamente iguales (igual nombre, parámetros y valor retornado), no hay problema. Si sólo difieren en el valor retornado, la “herencia” falla. • Conflicto con nombre de campos: En realidad no hay conflicto ya que estos nombres son estáticos y siempre pueden ser accedidos con el calificador de su tipo, como en Sorteable. DECREASING. 8