2010-10-13 42 views
84

Lo que quiero decir es:¿Por qué una interfaz no puede implementar otra interfaz?

interface B {...} 

interface A extends B {...} // allowed 

interface A implements B {...} // not allowed 

busqué en Google y me encontré this:

implements denota definir una implementación para los métodos de una interfaz. Sin embargo, las interfaces no tienen implementación, por lo que no es posible.

Sin embargo, la interfaz es una clase 100% abstracta, y una clase abstracta puede implementar interfaces (clase 100% abstracta) sin implementar sus métodos. ¿Cuál es el problema cuando se define como "interfaz"?

En detalles,

interface A { 
    void methodA(); 
} 

abstract class B implements A {} // we may not implement methodA() but allowed 

class C extends B { 
    void methodA(){} 
} 

interface B implements A {} // not allowed. 
//however, interface B = %100 abstract class B 

Respuesta

90

implements significa aplicación, cuando interface está destinado a declarar sólo para proporcionar interface no para su implementación.

Un 100% abstract class es funcionalmente equivalente a un interface pero también puede tener aplicación si así lo desea (en este caso no se mantendrá el 100% abstract), por lo que desde la perspectiva de la JVM que son cosas diferentes.

También la variable miembro en una clase 100% abstracta puede tener cualquier calificador de acceso, donde en una interfaz están implícitamente public static final.

+4

A partir de Java 8, interfaces pueden tener métodos predeterminados, haciéndolos mucho más similares a las clases abstractas en ese sentido. – forresthopkinsa

+0

¡Gracias por la última oración! –

22

implements significa que se definirá un comportamiento para los métodos abstract (excepto para las clases abstractas obviamente), usted define la implementación.

extends significa que se hereda un comportamiento.

Con interfaces se puede decir que una interfaz debe tener el mismo comportamiento que otra, ni siquiera hay una implementación real. Es por eso que tiene más sentido para una interfaz extends otra interfaz en lugar de implementarlo.


En una nota lateral, recuerde que incluso si una clase abstract puede definir abstract métodos (la manera sensata de una interfaz lo hace), sigue siendo una clasey todavía tiene que ser heredada (extendida) y no implementado.

4

Conceptualmente existen las dos clases e interfaces de "dominios". Dentro de estos dominios siempre se extiende, solo una clase implementa una interfaz, que es como "cruzar el límite". Así que, básicamente, "extiende" las interfaces refleja el comportamiento de las clases. Al menos creo que esta es la lógica detrás. Parece que no todos están de acuerdo con este tipo de lógica (me parece un poco artificial), y de hecho no hay ninguna razón técnica para tener dos palabras clave diferentes en absoluto.

+0

Si "Y se extiende X" y no se sella, entonces es posible tener otro tipo "Z" que se extiende "Y". Eso será cierto ya sea que X sea una interfaz o una clase. Sin embargo, si "W implementa X", entonces no es posible tener "V implementa W". El hecho de que "extends" se pueda "encadenar" e "implementar" no puede parecer una buena razón para tener diferentes palabras clave. – supercat

-5

Interfaz es la clase que contiene un método abstracto que no puede crear ningún objeto. Dado que la interfaz no puede crear el objeto y no es una clase pura, no vale la pena implementarlo.

2

Sin embargo, la interfaz es 100% clase abstracta y clase abstracta puede implementa la interfaz (100% clase abstracta) sin poner en práctica sus métodos . ¿Cuál es el problema cuando se define como "interfaz"?

Esto es simplemente una cuestión de convención. Los escritores del lenguaje Java decidieron que "extender" es la mejor manera de describir esta relación, así que eso es lo que todos usamos.

En general, a pesar de una interfaz es "una clase abstracta 100%," no pensamos acerca de ellos de esa manera. Normalmente pensamos en las interfaces como una promesa para implementar ciertos métodos clave en lugar de una clase de la que derivar. Y entonces tendemos a usar un lenguaje diferente para las interfaces que para las clases.

Como estado de otros, hay buenas razones para elegir "se extiende" sobre "instrumentos".

+0

Yessir. Es una cuestión de convención. Muchas personas intentan justificar _logically_ las restricciones de lenguaje Java originales de Sun, cuando se trata de un punto de vista personal. Si el compilador hubiera agregado interfaces de "implementos", creo que las mismas personas lo habrían justificado también. :-) –

1

Hope esto le ayudará un poco de lo que he aprendido en los oops (Java central) durante mi universidad.

Implementa marca que define una implementación para los métodos de una interfaz. Sin embargo, las interfaces no tienen implementación, por lo que no es posible. Sin embargo, una interfaz puede ampliar otra interfaz, lo que significa que puede agregar más métodos y heredar su tipo.

Este es un ejemplo más adelante, esta es mi entendimiento y lo que he aprendido en los oops.

interface ParentInterface{ 
     void myMethod(); 
} 

interface SubInterface extends ParentInterface{ 
     void anotherMethod(); 
} 

y tener una cosa en una mente de una interfaz sólo puede extender otra interfaz y si se quiere definir su función en alguna clase entonces sólo una interfaz en práctica por ejemplo por debajo

public interface Dog 
{ 
    public boolean Barks(); 

    public boolean isGoldenRetriever(); 
} 

Ahora, si eran una clase para implementar esta interfaz, esto es lo que se vería así:

public class SomeClass implements Dog 
{ 
    public boolean Barks{ 
    // method definition here 

    } 

    public boolean isGoldenRetriever{ 
    // method definition here 
    } 
} 

y si una clase abstracta tiene alguna función abstracta definir y declarar y que desea definir los f unction o puede decir implementar esas funciones entonces supongo que extiende esa clase porque la clase abstracta solo se puede extender. aquí está el ejemplo a continuación.

public abstract class MyAbstractClass { 

    public abstract void abstractMethod(); 
} 

Aquí es un ejemplo subclase de MyAbstractClass:

public class MySubClass extends MyAbstractClass { 

    public void abstractMethod() { 
     System.out.println("My method implementation"); 
    } 
} 
Cuestiones relacionadas