2012-04-19 33 views
37

en Java cuando una interfaz se extiende otra interfaz:interfaz amplía otra interfaz, pero pone en práctica sus métodos

  1. ¿Por qué poner en práctica sus métodos?
  2. ¿Cómo se puede poner en práctica sus métodos cuando una interfaz no puede contener un cuerpo método
  3. ¿Cómo puede implementar los métodos cuando se extiende la otra interfaz y no ponerlo en práctica?
  4. ¿Cuál es el propósito de una interfaz que implementa otra interfaz?

¡Esto tiene conceptos importantes en Java!

EDIT:

public interface FiresDragEvents { 

    void addDragHandler(DragHandler handler); 

    void removeDragHandler(DragHandler handler); 
} 


public interface DragController extends FiresDragEvents { 

    void addDragHandler(DragHandler handler); 

    void removeDragHandler(DragHandler handler); 

    void dragEnd(); 

    void dragMove(); 
} 

en Eclipse no es el signo de poner en práctica, además de los métodos implementados en DragController.

Y cuando muevo el mouse, dice que implementa el método !!!

+3

cuando extiende una interfaz sólo se puede añadir a la misma, esto es por qué lo hace. Las interfaces no implementan métodos. –

+4

No obtengo el voto en negativo. . . – GingerHead

Respuesta

45

¿Por qué poner en práctica sus métodos? ¿Cómo puede implementar sus métodos cuando una interfaz no puede contener el cuerpo del método? ¿Cómo puede implementar los métodos cuando extiende la otra interfaz y no la implementa? ¿Qué es el propósito de una interfaz que implementa otra interfaz?

La interfaz no implementa los métodos de otra interfaz sino que simplemente los amplía. Un ejemplo donde la extensión de interfaz es necesaria es: considere que tiene una interfaz de vehículo con dos métodos moveForward y moveBack pero también necesita incorporar la aeronave que es un vehículo pero con algunos métodos adicionales como moveUp, moveDown así que al final tiene:

public interface IVehicle { 
    bool moveForward(int x); 
    bool moveBack(int x); 
}; 

y el avión:

public interface IAirplane extends IVehicle { 
    bool moveDown(int x); 
    bool moveUp(int x); 
}; 
+0

Entonces, básicamente estás acumulando métodos en un lugar llamado 'IAirplane' y realmente no estás heredando. Otro punto es que le pediría al autor de 'IVehicle' que entienda por qué esta interfaz' Ivehicle' no está diseñada para considerar 'moveDown()' y 'moveBack()', porque 'interface' se descubre a partir del conjunto existente de clases concretas (supongo que el concepto de avión está disponible como parte de su generación). En general, creo que ampliar una interfaz es una consecuencia del mal diseño existente, ya que estamos rompiendo el propósito de 'extends' en este escenario. – overexchange

+0

@overexchange ninguna interfaz en este caso está diseñada antes de las clases. La interfaz describe una funcionalidad; sin embargo, las clases representan los objetos del mundo real. Esta es una diferencia principal entre las clases y los interaces. No con respecto a moveUp moveDown y demás. Cualquier vehículo puede avanzar y retroceder, pero no todos pueden moverse hacia arriba o hacia abajo. Las aeronaves pueden moverse hacia atrás y también hacia arriba y hacia abajo, pero diferentes tipos de aeronaves lo harán de una manera diferente. – AlexTheo

+0

No te entendí cuando dijiste: 'la interfaz en este caso está diseñada antes de las clases. En cualquier caso, cualquier diseño de software se descubre después de diseñar clases concretas. – overexchange

6

anuncio 1. No implementa sus métodos.

publicitario 4. El propósito de una interfaz extendiendo, sin implementar otra, es construir una interfaz más específica. Por ejemplo, SortedMap es una interfaz que se extiende Map. Un cliente que no esté interesado en el aspecto de clasificación puede codificar contra Map y manejar todas las instancias de, por ejemplo, TreeMap, que implementa SortedMap. Al mismo tiempo, otro cliente interesado en el aspecto ordenado puede usar esas mismas instancias a través de la interfaz SortedMap.

En su ejemplo, repite los métodos desde la superinterfaz. Si bien es legal, no es necesario y no cambia nada en el resultado final. El código compilado será exactamente el mismo si estos métodos están allí o no. Cualquiera que sea el "hover" de Eclipse dice que es irrelevante para la verdad básica de que una interfaz no implementa nada.

18

Una interfaz define el comportamiento. Por ejemplo, una interfaz Vehicle puede definir el método move().

A Auto es un Vehículo, pero presenta un comportamiento adicional. Por ejemplo, la interfaz Car puede definir el método startEngine(). Dado que un automóvil también es un vehículo, la interfaz Car amplía la interfaz Vehicle y, por lo tanto, define dos métodos: move() (heredado) y startEngine().

La interfaz del coche no tiene ninguna implementación de método. Si crea una clase (Volkswagen) que implementa Car, deberá proporcionar implementaciones para todos los métodos de su interfaz: move() y startEngine().

Una interfaz no puede implementar ninguna otra interfaz. Solo puede extenderlo.

+2

Los he respondido. Las 3 primeras preguntas no tienen sentido, ya que una interfaz no implementa otra interfaz y no contiene ninguna implementación de método. El 4 ° es respondido por mi respuesta: permite proporcionar comportamientos/métodos adicionales. –

+2

Lo describiría como un pequeño error de Eclipse. No tiene sentido volver a definir los métodos en la interfaz DragController, excepto si desea proporcionar javadoc adicional. –

Cuestiones relacionadas