+ All Categories
Home > Documents > Interfaces - Facultad de Cienciashp.fciencias.unam.mx/~alg/pAvz/interfaces.pdf · Una clase...

Interfaces - Facultad de Cienciashp.fciencias.unam.mx/~alg/pAvz/interfaces.pdf · Una clase...

Date post: 18-Aug-2020
Category:
Upload: others
View: 1 times
Download: 0 times
Share this document with a friend
28
Interfaces Amparo L´ opez Gaona Septiembre de 2008 Amparo L´ opez Gaona () Interfaces Septiembre de 2008 1/1
Transcript
Page 1: Interfaces - Facultad de Cienciashp.fciencias.unam.mx/~alg/pAvz/interfaces.pdf · Una clase abstracta puede extender otra clase. Al implementar una interfaz se deben implementar todos

Interfaces

Amparo Lopez Gaona

Septiembre de 2008

Amparo Lopez Gaona () Interfaces Septiembre de 2008 1 / 1

Page 2: Interfaces - Facultad de Cienciashp.fciencias.unam.mx/~alg/pAvz/interfaces.pdf · Una clase abstracta puede extender otra clase. Al implementar una interfaz se deben implementar todos

Interfaces

Las interfaces Java permiten al disenador de clases establecer suforma definiendo el comportamiento que debe tener pero sinespecificar la implementarlo.

Se trata de declarar metodos abstractos y constantes queposteriormente puedan ser implementados de diferentes maneras.

Para crear una interfaz, se utiliza la palabra reservada interface enlugar de class.

Para indicar que una clase implementa los metodos de una interfaz seutiliza la palabra clave implements.

Amparo Lopez Gaona () Interfaces Septiembre de 2008 2 / 1

Page 3: Interfaces - Facultad de Cienciashp.fciencias.unam.mx/~alg/pAvz/interfaces.pdf · Una clase abstracta puede extender otra clase. Al implementar una interfaz se deben implementar todos

Declaracion y uso

Ejemplo:

interface InstrumentoMusical {void tocar();void afinar();String tipoInstrumento();

}

Y una clase que implementa la interfaz:

class InstrumentoViento implements InstrumentoMusical {void tocar() { . . . };void afinar() { . . .};String tipoInstrumento() {}

}

class FlautaDulce extends InstrumentoViento {String tipoInstrumento() {return "Flauta Dulce";

}} Amparo Lopez Gaona () Interfaces Septiembre de 2008 4 / 1

Page 4: Interfaces - Facultad de Cienciashp.fciencias.unam.mx/~alg/pAvz/interfaces.pdf · Una clase abstracta puede extender otra clase. Al implementar una interfaz se deben implementar todos

Referencias a Interfaces

Es posible crear referencias a interfaces. Esta referencia puede ser asignadaa objetos de la clase que implementa la interfaz.No se pueden tener objetos de interfaces.

InstrumentoMusical instrumento = new FlautaDulce();instrumento.afinar();System.out.prinln(instrumento.tipoInstrumento());

InstrumentoMusical instM = new InstrumentoMusical(); //error.

Amparo Lopez Gaona () Interfaces Septiembre de 2008 6 / 1

Page 5: Interfaces - Facultad de Cienciashp.fciencias.unam.mx/~alg/pAvz/interfaces.pdf · Una clase abstracta puede extender otra clase. Al implementar una interfaz se deben implementar todos

Agrupaciones de constantes

Como todos los datos miembros que se definen en una interfaz sonconstantes, y las interfaces no pueden instanciarse resultan una buenaherramienta para implementar grupos de constantes. Por ejemplo:

public interface Meses {int ENERO = 1 , FEBRERO = 2 . . . ;String [] NOMBRES_MESES = { " " , "Enero" , "Febrero" , . . . };

}

Esto puede usarse simplemente:System.out.println(Meses.NOMBRES MESES[ENERO]);

Amparo Lopez Gaona () Interfaces Septiembre de 2008 8 / 1

Page 6: Interfaces - Facultad de Cienciashp.fciencias.unam.mx/~alg/pAvz/interfaces.pdf · Una clase abstracta puede extender otra clase. Al implementar una interfaz se deben implementar todos

Diferencias entre interfaces y clases abstractas

En una interfaz no se implementa ningun metodo (aunque no seprecedan de la palabra abstract). En una clase abstracta puedehaber implementaciones.En una interfaz no pueden existir elementos privados. En una claseabstracta puede haber privados, protegidos y publicos.Una interfaz no es parte de la jerarquıa de clases. Clases sin relacionpueden implementarse en la misma interfaz.Una interfaz no tiene constructores. Una clase abstracta puede tenerconstructores.Una interfaz no puede extender clases. Una clase abstracta puedeextender otra clase.Al implementar una interfaz se deben implementar todos los metodosdefinidos en ella. Al extender una clase abstracta es posible posponerla implementacion de metodos.Una clase puede implementar varias interfaces pero solo puede teneruna superclase.

Amparo Lopez Gaona () Interfaces Septiembre de 2008 9 / 1

Page 7: Interfaces - Facultad de Cienciashp.fciencias.unam.mx/~alg/pAvz/interfaces.pdf · Una clase abstracta puede extender otra clase. Al implementar una interfaz se deben implementar todos

Elemento mayor de un arreglo

public class EnteroMayor {private int [] arreglo;

EnteroMayor(int [] nums) {arreglo = nums;

}

public int mayor() {int max = arreglo[0];

for (int i = 1; i < arreglo.length; i++)if (max < arreglo[i])max = arreglo[i];

return max;}

}

Amparo Lopez Gaona () Interfaces Septiembre de 2008 11 / 1

Page 8: Interfaces - Facultad de Cienciashp.fciencias.unam.mx/~alg/pAvz/interfaces.pdf · Una clase abstracta puede extender otra clase. Al implementar una interfaz se deben implementar todos

Elemento mayor de un arreglo

public class EnteroMayor {private int [] arreglo;

EnteroMayor(int [] nums) {arreglo = nums;

}

public int mayor() {int max = arreglo[0];

for (int i = 1; i < arreglo.length; i++)if (max < arreglo[i])max = arreglo[i];

return max;}

}

Amparo Lopez Gaona () Interfaces Septiembre de 2008 11 / 1

Page 9: Interfaces - Facultad de Cienciashp.fciencias.unam.mx/~alg/pAvz/interfaces.pdf · Una clase abstracta puede extender otra clase. Al implementar una interfaz se deben implementar todos

... Elemento mayor de un arreglo

1 Quiero que esta clase sea generica, ¿como hago?

public class EnteroMayor {private Object [] arreglo;

EnteroMayor(Object [] nums) {arreglo = nums;

}

public int mayor() {Object max = arreglo[0];

for (int i = 1; i < arreglo.length; i++)if (max < arreglo[i])max = arreglo[i];

return max;}

}

Amparo Lopez Gaona () Interfaces Septiembre de 2008 13 / 1

Page 10: Interfaces - Facultad de Cienciashp.fciencias.unam.mx/~alg/pAvz/interfaces.pdf · Una clase abstracta puede extender otra clase. Al implementar una interfaz se deben implementar todos

... Elemento mayor de un arreglo

1 Quiero que esta clase sea generica, ¿como hago?

public class EnteroMayor {private Object [] arreglo;

EnteroMayor(Object [] nums) {arreglo = nums;

}

public int mayor() {Object max = arreglo[0];

for (int i = 1; i < arreglo.length; i++)if (max < arreglo[i])max = arreglo[i];

return max;}

}

Amparo Lopez Gaona () Interfaces Septiembre de 2008 13 / 1

Page 11: Interfaces - Facultad de Cienciashp.fciencias.unam.mx/~alg/pAvz/interfaces.pdf · Una clase abstracta puede extender otra clase. Al implementar una interfaz se deben implementar todos

... Elemento mayor de un arreglo

1 ¿Como comparo?

En el paquete java.util existe la interfazComparator, definida como sigue:

public interface Comparator {public int compare(Object o1, Object o2);public boolean equals(Object obj);

}

Amparo Lopez Gaona () Interfaces Septiembre de 2008 15 / 1

Page 12: Interfaces - Facultad de Cienciashp.fciencias.unam.mx/~alg/pAvz/interfaces.pdf · Una clase abstracta puede extender otra clase. Al implementar una interfaz se deben implementar todos

... Elemento mayor de un arreglo

1 ¿Como comparo? En el paquete java.util existe la interfazComparator, definida como sigue:

public interface Comparator {public int compare(Object o1, Object o2);public boolean equals(Object obj);

}

Amparo Lopez Gaona () Interfaces Septiembre de 2008 15 / 1

Page 13: Interfaces - Facultad de Cienciashp.fciencias.unam.mx/~alg/pAvz/interfaces.pdf · Una clase abstracta puede extender otra clase. Al implementar una interfaz se deben implementar todos

... Elemento mayor de un arreglo

import java.util.Comparator;public class ObjetoMayor {private Object [] arreglo;private final Comparator prueba;

ObjetoMayor(Object [] o, Comparator c) {arreglo = o;prueba = c;

}public Object mayor() {Object max = arreglo[0];

for (int i = 1; i < arreglo.length; i++)if (prueba.compare(max,arreglo[i]) < 0)max = arreglo[i];

return max;}

}Amparo Lopez Gaona () Interfaces Septiembre de 2008 17 / 1

Page 14: Interfaces - Facultad de Cienciashp.fciencias.unam.mx/~alg/pAvz/interfaces.pdf · Una clase abstracta puede extender otra clase. Al implementar una interfaz se deben implementar todos

Implementacion del comparador (Envolturas)

En lugar de un objeto de una clase puede ir uno de cualquiera de sussubclases.

Los tipos primitivos no son clases, por tanto no son subclases deObject, ası que no se pueden utilizar en la clase anterior.

Java tiene, en el paquete java.lang, clases para trabajar con datosprimitivos como objetos. (Envolturas)Boolean, Byte, Double, Float, Integer, Long, Short yCharacter.Estas clases tienen dos tipos de metodos.

Constructores con un parametro que corresponde a su tipo primitivo.

Integer miEntero;int i = 242;miEntero = new Integer(i);

Metodos que regresan el valor almacenado dentro de la envoltura. Sunombre es el del tipo primitivo seguido de la palabra Value y no tienenparametros. i = miEntero.intValue();

Amparo Lopez Gaona () Interfaces Septiembre de 2008 19 / 1

Page 15: Interfaces - Facultad de Cienciashp.fciencias.unam.mx/~alg/pAvz/interfaces.pdf · Una clase abstracta puede extender otra clase. Al implementar una interfaz se deben implementar todos

... Implementacion del comparador para enteros

public class ComparaEnteros implements java.util.Comparator {public int compare(Object o1, Object o2) {return ((Integer)o1).intValue() - ((Integer)o2).intValue();

}}

public class Prueba {public static void main(String [] pps) {Integer [] a = {new Integer(12), new Integer(45), new Integer(67),

new Integer(-2), new Integer(-8), new Integer(323),new Integer(125), new Integer(78), new Integer(987),new Integer(670)};

ObjetoMayor objMayor = new ObjetoMayor(a, new ComparaEnteros());System.out.println("El mayor es "+ (Integer)objMayor.mayor());

}}

Amparo Lopez Gaona () Interfaces Septiembre de 2008 21 / 1

Page 16: Interfaces - Facultad de Cienciashp.fciencias.unam.mx/~alg/pAvz/interfaces.pdf · Una clase abstracta puede extender otra clase. Al implementar una interfaz se deben implementar todos

... Implementacion del comparador para otros objetos

public class ComparaAlumnos implements java.util.Comparator {public int compare(Object o1, Object o2) {if (o1 == o2) return 0;if(o1 == null) return -1;if(o2 == null) return 1;return (int) ((Alumno)o1).promedio() - ((Alumno)o2).promedio();

}}

ObjetoMayor objMayor = new ObjetoMayor(a, new ComparaAlumnos());

public class ComparaAlumnos implements java.util.Comparator {public int compare(Object o1, Object o2) {... // Primeras 3 lineas como antesEstudiante e1 = (Alumno) o1, e2 = (Alumno) o2;int difPromedio = (int) (e2.promedio()-e1.promedio());if (difPromedio == 0)return e2.obtenNombre().compareTo(e1.obtenNombre()) * (-1);

elsereturn difPromedio; } }

Amparo Lopez Gaona () Interfaces Septiembre de 2008 23 / 1

Page 17: Interfaces - Facultad de Cienciashp.fciencias.unam.mx/~alg/pAvz/interfaces.pdf · Una clase abstracta puede extender otra clase. Al implementar una interfaz se deben implementar todos

Interfaces y TAD

public interface Conjuntable {public void agregarElemento(Object elem);public void eliminarElemento(Object elem);public boolean contieneElemento (Object elem);public boolean estaVacio();public int tamanio();public Conjuntable union(Conjuntable s1, Conjuntable s2);public Conjuntable interseccion(Conjuntable s1, Conjuntable s2);public Conjuntable diferencia(Conjuntable s1, Conjuntable s2);public boolean subconjunto(Conjuntable s1);

}

Amparo Lopez Gaona () Interfaces Septiembre de 2008 25 / 1

Page 18: Interfaces - Facultad de Cienciashp.fciencias.unam.mx/~alg/pAvz/interfaces.pdf · Una clase abstracta puede extender otra clase. Al implementar una interfaz se deben implementar todos

... Interfaces y TAD

public class Conjunto implements Conjuntable {

private Object[] datos;

public Conjunto() { this(20); }

public Conjunto(int tam) {

datos = new Object[tam <= 0 ? 20 : tam];

for (int i = 0; i < datos.length; i++)

datos[i] = null;

}

public boolean estaVacio(){

for (int i = 0; i < datos.length; i++)

if (datos[i] != null) return false;

return true;

}

public int tamanio(){

int tam = 0;

for (int i = 0; i < datos.length; i++)

if (datos[i] != null) tam++;

return tam;

}

public boolean contieneElemento (Object elem){

if (!estaVacio())

for (int i = 0; i < datos.length; i++)

if (elem.equals(datos[i]))

return true;

return false;

}

Amparo Lopez Gaona () Interfaces Septiembre de 2008 27 / 1

Page 19: Interfaces - Facultad de Cienciashp.fciencias.unam.mx/~alg/pAvz/interfaces.pdf · Una clase abstracta puede extender otra clase. Al implementar una interfaz se deben implementar todos

... Interfaces y TAD

public void eliminarElemento(Object elem) {

for (int i = 0; i < datos.length; i++)

if (elem.equals(datos[i])) {

datos[i] = null;

return;

}

throw new ExcepcionDeConjunto("El elemento "+elem+

" no se puede eliminar pues no est\’a en el conjunto");

}

public void agregarElemento(Object elem){

if (! contieneElemento(elem)) {

for (int i=0; i < datos.length; i++)

if (datos[i] == null) {

datos[i] = elem;

return;

}

throw new ExcepcionDeConjunto("El conjunto est’a lleno.");

}

throw new ExcepcionDeConjunto("El elemento "+elem+" ya est’a en el conjunto");

}

... // Otros m’etodos

Amparo Lopez Gaona () Interfaces Septiembre de 2008 29 / 1

Page 20: Interfaces - Facultad de Cienciashp.fciencias.unam.mx/~alg/pAvz/interfaces.pdf · Una clase abstracta puede extender otra clase. Al implementar una interfaz se deben implementar todos

Iteradores

class PruebaConjuntos {public static void main(String [] pps) {Conjunto grupo = new Conjunto();

... // Instrucciones para llenar el conjunto

?‘C’omo imprimo todos los elementos del conjunto?}

}

Amparo Lopez Gaona () Interfaces Septiembre de 2008 31 / 1

Page 21: Interfaces - Facultad de Cienciashp.fciencias.unam.mx/~alg/pAvz/interfaces.pdf · Una clase abstracta puede extender otra clase. Al implementar una interfaz se deben implementar todos

Iteradores

public interface Iterator {public boolean hasNext();public Object next();public void remove();

}

Los metodos de la interfaz Iterador tienen el siguiente proposito:

hasNext devuelve un valor booleano indicando si hay un siguienteelemento (true) y apunta a tal elemento. En caso de no haber maselementos devuelve false.

next devuelve el siguiente elemento. Al no haber elemento dispara laexcepcion NoSuchElementException.

remove permite eliminar un elemento de la coleccion.

Amparo Lopez Gaona () Interfaces Septiembre de 2008 33 / 1

Page 22: Interfaces - Facultad de Cienciashp.fciencias.unam.mx/~alg/pAvz/interfaces.pdf · Una clase abstracta puede extender otra clase. Al implementar una interfaz se deben implementar todos

... Iteradores

import java.util.*;

public class Conjunto implements Conjuntable {

... // Misma estructura y m’etodos que antes

public Iterator elementos () {

return new miIterador();

}

private class miIterador implements Iterator {

private int pos;

public miIterador(){

pos = 0;

}

public boolean hasNext() {

while (pos < datos.length && datos[pos] == null)

pos++;

return (pos < datos.length);

}

public Object next() throws NoSuchElementException {

if (hasNext())

return datos[pos++];

throw new NoSuchElementException("No hay elementos en el conjunto");

}

public void remove() throws IllegalStateException,

NoSuchElementException {}

}

}

Amparo Lopez Gaona () Interfaces Septiembre de 2008 35 / 1

Page 23: Interfaces - Facultad de Cienciashp.fciencias.unam.mx/~alg/pAvz/interfaces.pdf · Una clase abstracta puede extender otra clase. Al implementar una interfaz se deben implementar todos

... Iteradores

public static void main( String[] pps) {...

System.out.println("Voy a imprimir: ");for (Iterator it = c.elementos(); it.hasNext();)

System.out.print((Integer) it.next() + " ");}

Union de conjuntos

public void union(Conjunto c) {Iterator it = c.elementos();while(it.hasNext()) {agregarElemento(it.next());

}}

Amparo Lopez Gaona () Interfaces Septiembre de 2008 37 / 1

Page 24: Interfaces - Facultad de Cienciashp.fciencias.unam.mx/~alg/pAvz/interfaces.pdf · Una clase abstracta puede extender otra clase. Al implementar una interfaz se deben implementar todos

... Iteradores

public static void main( String[] pps) {...

System.out.println("Voy a imprimir: ");for (Iterator it = c.elementos(); it.hasNext();)

System.out.print((Integer) it.next() + " ");}

Union de conjuntos

public void union(Conjunto c) {Iterator it = c.elementos();while(it.hasNext()) {agregarElemento(it.next());

}}

Amparo Lopez Gaona () Interfaces Septiembre de 2008 37 / 1

Page 25: Interfaces - Facultad de Cienciashp.fciencias.unam.mx/~alg/pAvz/interfaces.pdf · Una clase abstracta puede extender otra clase. Al implementar una interfaz se deben implementar todos

... Iteradores

public static void main( String[] pps) {...

System.out.println("Voy a imprimir: ");for (Iterator it = c.elementos(); it.hasNext();)

System.out.print((Integer) it.next() + " ");}

Union de conjuntos

public void union(Conjunto c) {Iterator it = c.elementos();while(it.hasNext()) {agregarElemento(it.next());

}}

Amparo Lopez Gaona () Interfaces Septiembre de 2008 37 / 1

Page 26: Interfaces - Facultad de Cienciashp.fciencias.unam.mx/~alg/pAvz/interfaces.pdf · Una clase abstracta puede extender otra clase. Al implementar una interfaz se deben implementar todos

Interfaces y polimorfismo

En Java solo existe la herencia simple, pero las clases pueden implementarinterfaces.

public abstract class Animal {public abstract void hablar();

}class Perro extends Animal{

public void hablar(){ System.out.println("!‘Guau!"); }}class Gato extends Animal{

public void hablar(){ System.out.println("!‘Miau!"); }}public class AnimalesParlantes {public static void main(String[] pps) {Gato gato=new Gato();hazleHablar(gato);

}

static void hazleHablar(Animal sujeto){ sujeto.hablar(); }} Amparo Lopez Gaona () Interfaces Septiembre de 2008 39 / 1

Page 27: Interfaces - Facultad de Cienciashp.fciencias.unam.mx/~alg/pAvz/interfaces.pdf · Una clase abstracta puede extender otra clase. Al implementar una interfaz se deben implementar todos

... Interfaces y polimorfismo

public interface Parlanchin {public abstract void hablar();

}

public abstract class Animal implements Parlanchin{public abstract void hablar();

}

class Perro extends Animal{public void hablar(){

System.out.println("!‘Guau!");}

}

class Gato extends Animal{public void hablar(){

System.out.println("!‘Miau!");}

} Amparo Lopez Gaona () Interfaces Septiembre de 2008 41 / 1

Page 28: Interfaces - Facultad de Cienciashp.fciencias.unam.mx/~alg/pAvz/interfaces.pdf · Una clase abstracta puede extender otra clase. Al implementar una interfaz se deben implementar todos

... Interfaces y polimorfismo

public abstract class Reloj { ...}class Cucu extends Reloj implements Parlanchin{

public void hablar(){System.out.println("!‘Cucu, cucu, ..!");

}}

public class Polimorfismo {public static void main(String[] args) {Gato gato=new Gato();hazleHablar(gato);Cucu cucu=new Cucu();hazleHablar(cucu);

}

static void hazleHablar(Parlanchin sujeto){sujeto.hablar();

}}

Amparo Lopez Gaona () Interfaces Septiembre de 2008 43 / 1


Recommended