Me pregunto ¿en qué circunstancias se le extendemos una interfaz de una interfaz? Porque, por ejemplo

interface A{
    public void method1();
}
interface B extends A{
    public void method2();
}
class C implements B{
    @Override public void method1(){}
    @Override public void method2(){}
}

No es equivalente a

interface A{
    public void method1();
}
interface B{
    public void method2();     
}
class C implements A, B{
    @Override public void method1(){}
    @Override public void method2(){}
}

Hay importantes razones detrás ?

  • En el primer caso, el programador de la clase C no es necesario conocer el detalle de que B hereda Una, solo tiene que leer la documentación de B.
InformationsquelleAutor peter | 2012-11-18

7 Comentarios

  1. 57

    Las razones importantes que dependen totalmente de lo que la interfaz se supone que debe hacer.

    Si usted tiene un interfaz de Vehículo y una interfaz Manejable que es lógico que todos los vehículos conducibles. Sin interfaz de la herencia de cada uno de los diferentes tipo de coche de clase va a requerir

    class ChevyVolt implements Vehicle, Drivable
    class FordEscort implements Vehicle, Drivable
    class ToyotaPrius implements Vehicle, Drivable

    y así sucesivamente.

    Como he dicho todos los vehículos conducibles así es más fácil tener:

    class ChevyVolt implements Vehicle
    class FordEscort implements Vehicle
    class ToyotaPrius implements Vehicle

    Con el Vehículo de la siguiente manera:

    interface Vehicle extends Drivable

    Y no tener que pensar en ello.

    • Gracias por el excelente ejemplo de sir…:)
    • ¿No sería bueno para el más fresco si usted da la interfaz del Vehículo se extiende Manejable interfaz codificados bloque.
  2. 12

    Sí que la hay: es como la herencia en cualquier otro lugar. Si B es un especialización de Un entonces debe ser escrito de esa manera. La segunda indica que la clase sólo pasa a implementar 2 interfaces con ninguna relación entre ellos.

    De que el resultado final punto de vista sólo podría utilizar varias interfaces en lugar de la manipulación de una jerarquía (tal y como se puede evitar utilizando heredado de comportamiento en una jerarquía de clases). Esto dejaría a la información más dispersas, sin embargo, y como (si no más) de manera significativa, se ofusca la intención de que el modelo de software.

    • A & B se interfaces‘s. Así que, ¿Qué significa cuando dicen B es A. interface es descubierto después de que el hormigón clases están diseñadas. Me siento ampliación de interfaces sale de la consecuencia de un mal diseño. Si usted entiende el significado de inherit no tiene sentido para heredar una interfaz. Tiene sentido para heredar la clase concreta porque representan o mostrar la naturaleza de los objetos del mundo real y que se heredan de que la naturaleza porque SubType también es parte de esa naturaleza. Por CIERTO, ¿me Puede dar un ejemplo en el jdk en la ampliación de las interfaces? me gustaría analizar.
    • Clases concretas corresponden a las implementaciones de los «objetos del mundo real», mientras que las interfaces de representar a sus contratos o definir exactamente qué se debe «mostrar». En general, si usted tiene una jerarquía de clases con la especialización de los contratos, a continuación, una interfaz correspondiente jerarquía puede hacer un poco de sentido. No voy a ejemplos de investigaciones para usted, pero yo apuesto a las Colecciones de la API está lleno de ellos.
    • Así, cuando uno dice, public interface List extends Collection{} a Qué te refieres, List es Iterable, Porque List es Collection y Collection es Iterable? Creo que esto es incorrecto. marque esta respuesta de oracle técnico que conoce a los diseñadores de la colección. Básicamente, mi punto es, no tiene sentido extender un interface desde la perspectiva del diseño.
    • Que el hilo cubre una instancia en particular que usted está generalizando con ambición. El subyacente de la discusión es acerca de la limitación de Java único de la herencia de implementación, que es el fundamento de toda esta conversación y la razón por la que a pesar de las extensiones de uso de clases abstractas y enfoques, como el Método de Plantilla debería ser preferido que no puede ser universal. Raspar una sola capa y la evaluación de la ampliación de Iterable solo es la más representativa. Me volvería a decir de la interfaz de jerarquías no debe ser profundo.
    • Yo hice. Me dijo que fuera de contexto y generalizada. La respuesta no dice que la ampliación de las interfaces es mala práctica, sólo que cuando especializaciones implica funcionalidad particular que puede ser implementado consistentemente en que deben ser manejados como tales en lugar de innecesariamente el desplazamiento de la responsabilidad de los ejecutores. No estoy diciendo que la práctica debería ser ciegamente adoptado, sino que está diciendo que debe ser totalmente evitado por lo que es más en responder a la Iterable comentario.
    • mi pregunta es, Como se dijo, de colecciones java es un buen ejemplo para entender acerca de la extensión de interfaces, por lo que considerando un ejemplo, public interface List extends Collection{} a Qué te refieres, List es-un Iterable, Porque List es-un Collection y Collection es-un Iterable?
    • Existen otras en todo el jdk también, colecciones acaba de llegar rápidamente a la mente. He aquí otra interfaz de jerarquía: docs.oracle.com/javase/7/docs/api/java/util/concurrent/…. Hay probablemente mucho más si realmente se ven de manera que tendría mucho para disipar incluso antes de llegar al estándar de los marcos y las bibliotecas fuera del núcleo de la plataforma.
    • Para responder a su última pregunta, sí que sería por qué. La jerarquía puede permitir que para el código de cliente que utiliza la más débil de tipo de referencia, con lo que puede, a continuación, libre de otro código a utilizar más los contratos específicos o tipos de implementación de todos, evitando cualquier tipo de acoplamiento (básicamente capas polimorfismo).

  3. 5

    Sí, hay una gran diferencia.

    En el primer ejemplo, su nueva interfaz B se define a extender de Una, así que adelante, cualquier clase que implementa B automáticamente implementa A. Básicamente, usted está diciendo al compilador «esto es lo que significa ser Una, esto es lo que significa ser un B, y oh, por el camino, todos los B son también Una de!» Que te permite decir cosas como…

    class C implements B {
        ... you implement all of the methods you need...
        ...blah...
        ...blah...
    }
    A myNewA = new C();

    y que funciona bien.

    Pero, en su segundo ejemplo, no se declara B extender Una, por lo que el código anterior no funciona. Cuando intenta asignar una instancia de (el segundo tipo de) C en una referencia para Una, no se quejan, porque no dijo el compilador que «todos los B son realmente de Una.» (es decir, no hay relación entre B y C)

  4. 2

    Si usted no quiere para ser implementado sin la implementación de Un usted puede hacer B se extiende A.

    Ejemplo:

    interface LivingThing{
    public void eat();
    }
    
    interface Dog extends LivingThing{
    public void Bark();
    }

    Es posible ser un livingThing sin ser un perro, pero no es posible ser un perro sin ser un livingThing. Así que si se puede corteza también se puede comer, pero lo contrario no es siempre cierto.

  5. 1

    Lo que usted está diciendo es correcto, pero no es sólo acerca de la introducción de nuestro trabajo hecho, por lo que si el requisito es como este:

    1) Imagina que hay 10 interfaces, no se ha diseñado al mismo tiempo. Por ejemplo, el AutoCloseable interfaz en Java 7. Un nuevo cierre automático la característica añadida, es que no estaba allí, hasta que Java 6.

    2) Si usted ha diseñado una interfaz de C, que es un marcador de la interfaz y desea que todas las clases derivan de una clase dada B a ser marcado, la mejor solución sería el uso de B se extiende C y no va y poner los implementos C en todas partes.

    Hay muchas más razones. Si usted mira el cuadro más grande de las clases y la jerarquía, podría obtener la respuesta de usted.

    Feliz de Ayudar
    Dharam

  6. 0

    La principal diferencia aquí es que en el primer ejemplo B es Una y, a continuación, algunos. Eso significa que la Interfaz de B llamadas method1() y method2(), mientras que en el segundo a y B son independientes (interfaz de B NO concluye method1()) y clase C implementa a y B. En ambos intances Clase C anulará method1() y method2(). Espero que esto ayude!

  7. 0

    sólo hay un comentario en

    interface A{
        public void method1();
    }
    interface B extends A{
        public void method2();
    }
    class C implements B{
        @Override public void method1(){}
        @Override public void method2(){}
    }

    si se declara Un a = new C();

    usted NO puede llamar a method2(); debido a que la interfaz de Una no sabe nada acerca de los elementos en la interfaz de B, incluso se implementa métodos en la clase C

Dejar respuesta

Please enter your comment!
Please enter your name here