¿Por qué una interfaz no puede implementar otra interfaz?


104

Lo que quiero decir es:

interface B {...}

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

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

Lo busqué en Google y encontré esto :

implementsdenota definir una implementación para los métodos de una interfaz. Sin embargo, las interfaces no tienen implementación, por lo que eso 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

Respuestas:


110

implementssignifica implementación, cuando interfacese pretende declarar solo para proporcionar interfaceno para la implementación.

Un 100% abstract classes funcionalmente equivalente a un interfacepero también puede tener implementación si lo desea (en este caso no permanecerá al 100% abstract), así que desde la perspectiva de la JVM son cosas diferentes.

Además, 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.


8
A partir de Java 8, las interfaces pueden tener métodos predeterminados, lo que los hace mucho más similares a las clases abstractas en ese sentido.
forresthopkinsa

4
¡Gracias por la última frase!
Tao Zhang

24

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

extends significa que un comportamiento se hereda.

Con las interfaces es posible decir que una interfaz debería tener el mismo comportamiento que otra, ni siquiera hay una implementación real. Es por eso que tiene más sentido para una interfaz a extendsotra interfaz en lugar de implementarla.


En una nota al margen, recuerde que incluso si una abstractclase puede definir abstractmétodos (de la misma manera que lo hace una interfaz), sigue siendo una clase y aún debe heredarse (extenderse) y no implementarse.


4

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


Si "Y extiende X" y no está sellado, entonces es posible tener otro tipo "Z" que extienda "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 "extiende" se pueda "encadenar" y "implementar" no parece una buena razón para tener diferentes palabras clave.
supercat

2

Sin embargo, la interfaz es 100% de clase abstracta y la clase abstracta puede implementar la interfaz (100% de clase abstracta) sin implementar 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, aunque una interfaz es "una clase 100% abstracta", no pensamos en ellos de esa manera. Por lo general, pensamos en las interfaces como una promesa para implementar ciertos métodos clave en lugar de una clase de la que derivar. Por eso, tendemos a utilizar un lenguaje diferente para las interfaces que para las clases.

Como afirman otros, hay buenas razones para elegir "se extiende" en lugar de "implementos".


Sí señor. Es una cuestión de convención. Mucha gente intenta justificar lógicamente las limitaciones del lenguaje Java original de Sun, cuando es solo un punto de vista personal. Si el compilador hubiera agregado interfaces de "implementos", supongo que las mismas personas lo habrían justificado también. :-)
Little Santi

1

Espero que esto te ayude un poco a lo que he aprendido en oops (core java) durante mi universidad.

Implementos denota definir una implementación para los métodos de una interfaz. Sin embargo, las interfaces no tienen implementación, por lo que eso no es posible. Sin embargo, una interfaz puede extender otra interfaz, lo que significa que puede agregar más métodos y heredar su tipo.

Aquí hay un ejemplo a continuación, este es mi entendimiento y lo que he aprendido en ¡Ups!

interface ParentInterface{  
        void myMethod();  
}  

interface SubInterface extends ParentInterface{  
        void anotherMethod();  
}  

y tenga en cuenta una cosa: una interfaz solo puede extender otra interfaz y si desea definir su función en alguna clase, solo se implementa una interfaz, por ejemplo, a continuación

public interface Dog
{
    public boolean Barks();

    public boolean isGoldenRetriever();
}

Ahora, si una clase implementara esta interfaz, 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 define y declara y quieres definir esas funciones o puedes decir implementar esas funciones, entonces supones extender esa clase porque la clase abstracta solo se puede extender. aquí hay un ejemplo a continuación.

public abstract class MyAbstractClass {

    public abstract void abstractMethod();
}

Aquí hay una subclase de ejemplo de MyAbstractClass:

public class MySubClass extends MyAbstractClass {

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

0

La interfaz es como una abstracción que no proporciona ninguna funcionalidad. Por lo tanto, no 'implementa' sino que extiende las otras abstracciones o interfaces.


-6

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.