[Duda] Interfaces (objetos).

Iniciado por The Swash, 8 Septiembre 2012, 21:19 PM

0 Miembros y 1 Visitante están viendo este tema.

The Swash

Buenas tardes,

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 (java) [Seleccionar]
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 (java) [Seleccionar]
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(){
E[]temp = (E[]) new Object[data.length*2];
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(){
data = (E[]) new Object[1];
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++)
System.out.print(data[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;
}

public static void main(String[] args ){
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();
System.out.println(lista.removeAll("A"));
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 (java) [Seleccionar]
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.

sapito169

#1
mira es raro de que te intereses y te descuenta de esos detalles se nota que tienes madera para ser arquitecto por que la mayoría ni le interesa y/o ni lo entiende y/o ni sabe que existe este tipos de cosas  ;-)

Citar¿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?.

mira la respuesta es simple clara y sin anbiguedades ni matieses si es posible

el segundo punto es que esta pregunta no es de opinión es un echo objetivo de la realidad y por lo tanto es totalmente comprobable ademas solo hay dos respuestas
las cuales son es posible y no es posible.En esos casos no preguntes experimenta descubre lo por tu cuenta recuerda que comprobarlo es muy fácil y esta a tu alcance

por que preguntas si tu mismo lo as demostrado?




ChavalChavito

Un termino que me ayudo mucho a entender el concepto es q la interfaz es como un contrato entre la clase y el mundo exterior..
En la interfaz se definen una serie de metodos, los cuales debe de ser reescritos en TODA CLASE QUE IMPLEMENTE DICHA INTERFAZ.
El compilador cdo se ejecuta se encarga d controlar q todos los metodos sean llamados desd la clase q implementa la interfaz....

Interfaz Ejemplo = new Clase<String>;
* Solo los metodos de la interfaz
Clase Ejemplo = new Clase<String>;
* Todos los metodos d la clase

The Swash

Hola,

Muchas gracias por vuestras amables y contundentes respuestas.

Un saludo,
Iván Portilla.