2012-07-11 22 views
43

¿Hay alguna manera de NO implementar todos los métodos de una interfaz en una clase heredada?no implementando todos los métodos de interfaz. ¿Es posible?

+1

ver http: // stackoverfl ow.com/questions/2294738/confusion-in-regarding-implementing-interface-methods?rq=1 – fvu

+2

¿cuál sería su caso de uso? –

+0

Una buena redacción en [Principio de segregación de interfaz] (https://realm.io/news/donn-felker-solid-part-4/) – AimanB

Respuesta

49

La única forma de evitar esto es declarar su clase como abstract y dejar que una subclase implemente los métodos faltantes. Pero, en última instancia, alguien en la cadena tiene que implementarlo para cumplir con el contrato de interfaz. Si realmente no necesita un método en particular, puede implementarlo y luego return o lanzar alguna variedad de NotImplementedException, lo que sea más apropiado en su caso.

+4

Tengo una pregunta de seguimiento. Siempre he implementado solo la función 'compare()' de la interfaz 'Comparator' para ordenar objetos usando' Arrays.sort() '. Pero ahora que abro el [Javadoc] (https://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html), veo que hay muchos más métodos definidos allí. ¿Cómo, entonces, he podido hacer esto? –

4

Define esa clase como una clase abstract. Sin embargo, debe implementar esos métodos no implementados cuando desee crear una instancia de este (ya sea mediante el uso de una subclase o una clase anónima).

3

Si desea una clase instanciable, no es posible. Sin embargo, puede intentar definir una clase abstract.

53

El punto de una interfaz es garantizar que un objeto exteriormente comportarse como la interfaz especifica que se

Si no se implementa todos los métodos de la interfaz, lo que destruye todo el propósito de una interfaz .

+2

+1 para señalar la naturaleza contractual de una interfaz – fvu

3

Es posible y es fácil. Codifiqué un example.

Todo lo que tienes que hacer es heredar de una clase que implementa el método. Si no te importa una clase que no sea instanciable, entonces también puedes definir una clase abstract.

+0

Eso significa que están implementadas. –

+1

@TonyHopkinson Están implementados, pero no en la clase. – emory

+6

Bueno, sí, pero la pregunta era cómo no implementar no cómo implementar en otro lugar. –

4

Me hice la misma pregunta, y luego aprendí sobre Adapters. Solucionó mi problema, tal vez puede resolver el tuyo. Esto lo explica muy bien: https://blogs.oracle.com/CoreJavaTechTips/entry/listeners_vs_adapters

+2

Si bien este enlace puede responder a la pregunta, es mejor incluir las partes esenciales de la respuesta aquí y proporcionar el enlace de referencia. Las respuestas de solo enlace pueden dejar de ser válidas si la página vinculada cambia. - [De la crítica] (/ review/low-quality-posts/18790848) –

8

Podemos anular todos los métodos de interfaz en abstract clase primaria y en la clase secundaria anular solo aquellos métodos requeridos por esa clase secundaria particular.

interfaz

public interface MyInterface{ 
    void method1(); 
    void method2(); 
    void method3(); 
} 

Clase abstracta de Padres

public abstract class Parent implements MyInterface{ 
@Override 
public void method1(){ 

} 
@Override 
public void method2(){ 

} 
@Override 
public void method3(){ 

} 
} 

En sus clases hijas

public class Child1 extends Parent{ 
    @Override 
    public void method1(){ 

    } 
} 




public class Child2 extends Parent{ 
    @Override 
    public void method2(){ 

    } 
} 
Cuestiones relacionadas