2012-08-31 19 views
5

Para lograr herencia múltiple, debemos usar interfaces, pero ¿por qué los métodos de interfaz no tienen cuerpos y por qué tienen que ser reemplazados en la clase derivada?Por qué los métodos de interfaz no tienen cuerpo

Realmente quiero una respuesta lúcida, que no implica demasiada jerga informática, Parece que no puedo entender esto, me he referido varias referencias

+3

porque de lo contrario se habría conseguido el lío de regular (C++ similares) múltiple herencia, que generalmente es complejación redundante. – amit

+0

me preguntaron esto en una entrevista, ¿podría explicar esto? –

+2

Las interfaces son * no * "herencia múltiple". La herencia múltiple es fea, las interfaces son hermosas;) Y las interfaces no * se reemplazan *, están "implementadas". Para comprender las "interfaces" de Java, debe comprender el "polimorfismo OO". Una interfaz Java es un CONTRATO que una clase implementadora debe HONRAR. Una interfaz Java es "especificación"; una clase implementadora proporciona el "comportamiento" real. – paulsm4

Respuesta

13

Debido Java, en contraste con lenguajes como C++ o Eiffel, sólo tiene herencia múltiple de tipos (es decir, interfaces, así como una clase), herencia no múltiple de estado y comportamiento. Estos últimos agregan una enorme complejidad (especialmente estado).

Los diseñadores de Java (y C#, para el caso) optaron por no incluirlo ya que presentaba a los programadores de C++ a menudo con problemas muy difíciles de depurar. Puede resolver la mayoría de los problemas que requieren una verdadera herencia múltiple con la implementación de múltiples interfaces, por lo que se consideró que el intercambio valió la pena.

Tenga en cuenta que la herencia múltiple de comportamiento (no estatal) podría llegar a Java 8 (a menos que posponer de nuevo como una de las muchas otras cosas) en forma de métodos de extensión virtuales en una interfaz puede declarar un método que delega a uno en otra clase, que luego existe en todos los tipos que implementan esa interfaz.

+0

podría ser más específico sobre los tipos y el comportamiento, dando un poco ejemplo? por favor –

+1

Si tiene una clase, invariablemente tendrá * state *, es decir, campos. P.ej. para una hipotética clase 'Persona' que podría ser un nombre. Entonces las clases tienen * comportamiento * en forma de métodos. Los métodos hacen ciertas cosas y de cierta manera. Las interfaces, por el contrario, solo establecen el nombre y los argumentos de los métodos en una especie de contrato. La forma en que una clase implementadora implementa esos métodos depende de la clase, por lo que la interfaz no puede proporcionar un comportamiento, ya que no tiene una implementación del método. – Joey

+0

con esto quiere decir que cada clase derivada en Java, que implementa una interfaz, tendrá entonces la flexibilidad de tener su propio defining de un método en la interfaz. –

1

Una interfaz de Java contiene una lista de métodos que debe implementar la clase que implementa la interfaz. Por lo tanto, los métodos no tienen cuerpo: el cuerpo de cada método está en la (s) clase (s) de implementación.

2

Las interfaces declaran QUÉ servicios proporciona la clase implementadora, no CÓMO (ese es el trabajo de la clase implementadora). La herencia múltiple se considera mala, ya que conduce a códigos complicados y jerarquías de clases.

2

Las interfaces solo tienen variables constantes (public + static + final) y métodos abstractos (public & abstract). Estos están destinados a ser utilizados por las clases que implementan las interfaces.

Las interfaces simplemente dicen 'Soy un contrato', que si desea usar, debe apegarse a algunas reglas (dar implementación a todos los métodos abstractos).

La herencia múltiple se omite en Java asegurándose de que una clase puede extender solo 1 clase, para evitar el diamond problem. De todos modos, puede tener herencia múltiple de tipos en Java mediante el uso de interfaces.

0

métodos de interfaz no tiene cuerpo como

public interface Flyable 
{ 
public void fly(); 
} 

porque interfaz en sí misma no va a hacer nada

interfaz es define contrato.

una interfaz, por otro lado, define lo que una clase puede hacer, no es lo que es. Así que la interfaz es sobre los verbos por lo general.

De modo que la interfaz de Flyable no hace más que definir el contrato que van a volar los FlyableObjects implantados.

como:

class Rocket implements Flyable 
{ 
public void fly() 
{ 
// do the stuffs. 
} 
} 

interface

y por supuesto podemos lograr la herencia múltiple también sólo y únicamente a través de la interfaz.

1

respuesta simple:

Una interfaz proporciona un estándar para la implementación.

Explicación:
En Java una interfaz es similar a una clase abstracta en la que sus miembros se no se han aplicado. Por ejemplo,

public interface Comparable  
{ boolean less(Object m); 
    boolean greater(Object m); 
    boolean lessEqual(Object m); 
    boolean greaterEqual(Object m); 
} 

Una interfaz proporciona un estándar para la implementación.
El beneficio del uso de interfaces es que simula herencia múltiple. Todas las clases en Java deben tener exactamente una clase base, la única excepción es java.lang.Object (la clase de raíz del sistema de tipo Java); la herencia múltiple de clases no está permitida en Java.

Todos los métodos de instancia son implícitamente public y abstract. Puede marcarlos como tales, pero no se recomienda hacerlo ya que la marca se considera práctica obsoleta. Las interfaces en sí mismas no necesitan ser públicas y varias interfaces en las bibliotecas estándar no son públicas y, por lo tanto, se usan solo internamente.

Una interfaz crea un protocolo que clases pueden implementar. Tenga en cuenta que se puede ampliar una interfaz (para obtener una nueva interfaz) del mismo modo que puede ampliar una clase . De hecho, se puede ampliar varias interfaces. Interfaces así disfrutar de los beneficios de la herencia múltiple. (Clases no.) Hay casi sin desventajas a la herencia múltiple de la interfaz (conflictos de pequeño nombre los problemas son una excepción). Hay grandes desventajas a la herencia múltiple de la implementación como en C++. Estos incluyen eficiencia consideraciones, así como la dificultad semántica de determinar qué código se ejecutará en algunas circunstancias.

El polinomio clase que implementa Comparable tendrá que implementar todas las funciones declaradas en la interfaz.

public class Polynomial implements Comparable 
{ . . . 
    boolean less(Object m){ . . . } 
    boolean greater(Object m){ . . . } 
    boolean lessEqual(Object m){ . . . } 
    boolean greaterEqual(Object m){ . . . } 

    Polynomial multiply(Polynomial P){ . . . } 
    . . . 
} 

Una clase puede optar por aplicar cualquier número de interfaces. Una clase que implementa una interfaz debe proporcionar cuerpos para todos los métodos de esa interfaz . Además, esperamos que una clase abstracta pueda elegir implementar parte de una interfaz dejando el resto para subclases no abstractas.

La utilidad de las interfaces va más allá de la simple publicación de protocolos para otros programadores . Cualquier función puede tener parámetros de tipo . Cualquier objeto de una clase que implementa la interfaz se puede pasar como un argumento .

Referencias:
Interface
Interfaces
Interface Wiki

+2

-1; Si toma texto de un sitio, al menos debería proporcionar un enlace al original. Texto arrancado de este sitio: http://csis.pace.edu/~bergin/papers/Interface.html – maba

+0

@maba, Disculpe las molestias, solo quiero explicar el tema, lo he tomado de muchos lugares y lo he editado veces. si realmente necesita tener enlaces, ¡esta respuesta estará ** llena de enlaces! ** ¿Necesita enlaces o buena respuesta? mejor puedes concentrarte para mejorar la respuesta, si puedes hacerlo. –

+0

Necesitamos buenas ** respuestas ** originales. Si quien escribió el original quería venir aquí y pegarlo, más poder para él. Pero tú no eres él. No puedes hacer eso sin su permiso. El simple hecho de proporcionar un enlace al original no lo exime automáticamente de infracciones de derechos de autor. Pero en este caso, ni siquiera hiciste * eso *. – cHao

0

si las interfaces tenían cuerpos entonces se habrían devuelto el Daimond mortal de la muerte problema.

Considere este ejemplo tiene interfaces con cuerpos

interface A { 
    void print(){ System.out.print("A") } 
} 

interface B { 
    void print(){ System.out.print("B") } 
} 

interface C extends A, B { 
    // now since A and B have bodies interfaces would have had choice to not to override the default behavior 
} 

public class C_Implementer implements C{ 
    public static void main(String args[]){ 
     C c = new C_Implementer(); 
     c.print(); // gotcha!!!!! what should it print, A or B???? 
    } 
} 
0

Usted está pidiendo "¿Por qué Java no soporta herencia múltiple de implementación?"

Esto se discute en los Tutoriales de Java, Multiple Inheritance of State, Implementation, and Type, pero quería dar un ejemplo específico de los problemas de herencia múltiple de implementación (así como una nueva solución de características de idioma al final).

Imagine dos interfaces (en nuestra versión propuesta de Java que permite cuerpos de métodos de interfaz) que definen un método con el mismo nombre.

public interface FaceOne { 
    public void method() { 
     System.out.println("FaceOne Version"); 
    } 
} 

public interface FaceTwo { 
    public void method() { 
     System.out.println("FaceTwo Version"); 
    } 
} 

Y una clase implementa ambas interfaces, pero no anula el método.

public class Inheriter implements FaceOne, FaceTwo { 

} 

Cuando llamo Inheriter.method(), que funciona ya que la clase hereda el método de sus ancestros, surge el problema: lo hace la impresión de salida "Versión FaceOne" o "Versión FaceTwo"?

Además, si la clase debía sobrescribir el método, pero también quería llamar a la versión de su antecesor utilizando super, el compilador volvería a tener problemas para elegir entre una versión del método.

Es por eso que Java no admite herencia múltiple de implementación.


Como acotación al margen, creo que una manera elegante de implementar esto en el lenguaje sería la siguiente:

siguen obligando a las clases que implementan para reemplazar los métodos de la interfaz ancestro. Esto resuelve el primer problema de un método no invalidado.

Luego, use una notación similar a that of accessing an enclosing instance for an inner class para acceder a una interfaz ancestro específica con super. La clase Inheriter tendría entonces múltiples opciones:

  • No llamar super.method(), sino que sólo se utilice la aplicación recién definida.

  • Utilice FaceOne.super.method() para realizar la salida de implementación heredada predeterminada "FaceOne Version".

  • Utilice FaceTwo.super.method() para realizar la salida de implementación heredada predeterminada "Versión de FaceTwo".

  • Use una combinación de los anteriores:

Una aplicación podría ser:

@Override 
public void method() { 
    FaceOne.super.method(); 
    FaceTwo.super.method(); 
    System.out.println("Inheriter Version"); 
} 

Salida de:

FaceOne Versión

FaceTwo Versión

Inheriter Versión


Editar: De acuerdo con this question esto es al parecer exactamente cómo implementaciones por defecto se estructuran en Java 8.

Cuestiones relacionadas