Tengo una duda muy puntal respecto a las interfaces en java, las interfaces vienen siendo abstracción pura. Según mi concepto obligan a implementar métodos definidos en esta a clases que implementen la interfaz.
Mi duda surge en:
¿Si tengo una clase que implementa una interfaz, pero en dicha clase creo un método que no está definido en la interfaz funcionaría? o me veo límitado a los métodos de la interfaz?.
Con un ejemplo real:
Interfaz:
Código
public interface IList<E> { public void add(E target); public boolean isEmpty(); public boolean isFull(); public boolean contains (E target); public void set (int index, E target); public E get(int index); public E remove(int index); public boolean remove (E target); public void print(); }
Clase que implementa la interfaz:
Código
public class CList<E> implements IList<E> { private E[] data; private int size; public void add(int index, E target){ if ((index > 0) && (index < size)){ if(isFull()) stretch(); for (int i = index; i <= size; i++) data[i+1]= data[i]; data[index]= target; size++; } } public boolean isEmpty(){ return size==0; } public boolean isFull(){ return data.length == size; } private void stretch(){ for (int i=0; i<data.length; i++) temp[i]= data[i]; data=temp; } public void add(E target){ if(isFull()) stretch(); data [size]= target; size++; } public E get(int index){ if (index >0 && index< size) return data[index]; return null; } public void set(int index, E target){ if((index >= 0)&& (index< size)) data[index]= target; } public CList(){ size=0; } public boolean contains (E target){ for(int i = 0; i < size; i++){ if(data[i].equals(target)) return true; } return false; } public E remove(int index){ if (index>=0 && index < size){ E element= data[index]; for (int i= index; i<size-1; i++) data[i]=data[i+1]; size--; return element; } return null; } public boolean remove (E target){ for (int i=0; i<size; i++){ if (data[i].equals(target)){ E element= remove(i); size--; return true; } } return false; } public void print(){ if(! isEmpty()){ for (int i= 0; i<size; i++) } } public boolean removeAll(E target){ boolean resultado = true; int cont = 0; if (!isEmpty()){ while(resultado){ cont++; resultado = remove(target); } if (cont > 1) return true; } return false; } IList<String> lista=new CList<String>(); lista.print(); lista.add("B"); lista.add("F"); lista.add("A"); lista.add("Z"); lista.add("W"); lista.add("P"); lista.add("R"); lista.add("A"); lista.add("S"); lista.add("A"); lista.add("P"); lista.print(); lista.print(); } }
Claramente se puede notar al compilar un error por no encontrar el símbolo de la función "removeAll". Si declaro el método en la interfaz funciona sin ningún pero, entonces sólo quiero asegurarme de que la interfaz me limita los métodos que puede tener mi clase como "públicos".
Ahora mismo comprobé que si instancio la clase utilizando su mismo tipo de dato así:
Código
CList<String> lista = new CList<String>;
El problema desaparece y todo recae en crear un objeto del tipo Interfaz e instanciarlo con una clase que contiene métodos que la interfaz no contiene.
¿Estoy en lo correcto?
¿Por qué el error de la primera forma de instanciar la clase?
De poder entrar en detalle lo agradecería.
Muchas gracias,
Iván Portilla.