2010-08-20 15 views
43

En Java para implementar herencia múltiple usamos interfaces. ¿Es el único uso de interfaces? En caso afirmativo, ¿cuál es el uso principal de la interfaz en Java? ¿Por qué necesitamos interfaces en Java?¿Por qué necesitamos interfaces en Java?

+2

posible duplicado de [¿Por qué estamos implementando interfaces?] (http://stackoverflow.com/questions/1583654/why-we-are-implementing-interfaces) – Thilo

+0

También una buena explicación [aquí] (http://programmers.stackexchange.com/a/ 131334/146150). –

Respuesta

40

Diría que el uso principal es el polimorfismo, o la capacidad de realizar la misma operación en una serie de objetos diferentes. Si todos los objetos implementan la misma interfaz y tienen el mismo método, puede almacenar todos esos objetos en un Vector, por ejemplo, e iterar a través del Vector llamando a ese método en cada uno.

+2

Rob Estoy de acuerdo contigo, pero agregaría que separando el concepto de realización de interfaz de la extensión de clase (que en realidad choca en C++) puedes tener un polimorfismo sin herencia múltiple. – Sindico

5

Los necesita para que pueda escribir sus objetos fuera de la jerarquía.

Por ejemplo, los objetos que se pueden comparar pueden estar prácticamente en cualquier parte de la jerarquía de objetos; no es necesario que tengan un antecesor común que pueda compararse. String s se pueden comparar, Integer s se pueden comparar, incluso podría hacer su propio Frame s que se podría comparar (por ejemplo, un cuadro es "menos" que otro marco si está más en primer plano, es decir, si se superpone otro marco). Por lo tanto, si desea hacer referencia a algo que pueda compararse, se lo forzará a declarar una variable con el ancestro más general, en este caso, Object. Esto es demasiado general, porque entonces también puede recibir valores que no son comparables (y lanzaría errores cuando intente compararlos).

Por lo tanto, la interfaz Comparable: selecciona todas las clases que implementan la funcionalidad de comparación través de la jerarquía subclase-superclase.

13

Además de estas respuestas, diría que el uso más importante para las interfaces es reducir el acoplamiento entre los componentes de su software.

Una interfaz permite representar un acuerdo entre clases sobre cómo se comunicarán entre sí sin estar atados a las implementaciones reales.

Esto nos permite reemplazar implementaciones por otros (muy útil para probar o cambiar casos de uso) sin cambiar el código compilado.

-1

Cierto código no se compilará sin él.

Por ejemplo, en:

for (String name : list) 
{ 
    System.out.print("\nIn foreach loop: name: " + name); 
} 

list debe implementar la java.lang.Iterable interface.

+5

Esto es esencialmente lo mismo que decir que necesitas usar algo porque Tiene que. Esto no ** adecuadamente ** responde la pregunta. – rayryeng

+0

Lo sé. Simplemente estoy señalando que debemos usarlos en este caso, nos guste o no. Prefiero pensar que es análogo a ensamblar una P.C .: sin una cierta conformidad entre los conectores de hardware, reemplazar una parte como una fuente de alimentación o un disco duro sería mucho más difícil si no fueran intercambiables. Si esto no responde adecuadamente la pregunta, me gusta pensar que al menos ayuda a las personas a comprender por qué son útiles. –

27

También estaba pensando en cómo se usan las interfaces. Espero que esto ayude a otros:

Una interfaz es un contrato (o un protocolo, o un entendimiento común) de lo que las clases pueden hacer. Cuando una clase implementa una determinada interfaz , promete implementar todos los métodos abstractos declarados en la interfaz. La interfaz define un conjunto de comportamientos comunes . Las clases implementan la interfaz de acuerdo con estos comportamientos y proporcionan su propia implementación a los comportamientos. Este le permite programar en la interfaz, en lugar de la implementación real . Uno de los principales usos de la interfaz es proporcionar un contrato de comunicación entre dos objetos.Si conoce una clase implementa una interfaz, entonces sabe que la clase contiene implementaciones concretas de los métodos declarados en esa interfaz, y usted es garantizado para poder invocar estos métodos de forma segura. En otras palabras, dos objetos pueden comunicarse según el contrato definido en la interfaz , en lugar de su implementación específica.

En segundo lugar, Java no es compatible con herencia múltiple (mientras que C++ lo hace). La herencia múltiple le permite derivar una subclase de más que una superclase directa. Esto plantea un problema si dos superclases directas tienen implementaciones conflictivas. (¿Cuál seguir en la subclase?). Sin embargo, la herencia múltiple tiene su lugar. Java hace esto al permitirle "implementar" más de una interfaz (pero solo puede "extender" desde una sola superclase). Dado que las interfaces contienen solo métodos abstractos sin la implementación real de , no pueden surgir conflictos entre las múltiples interfaces. (interfaz puede contener constantes pero no se recomienda Si una subclase implementa dos interfaces con las constantes en conflicto, el compilador marcará un error de compilación..)

de: http://www.ntu.edu.sg/home/ehchua/programming/java/J3b_OOPInheritancePolymorphism.html#zz-6.6

+0

¿Se captura el propósito de 'interfaz Comparable' en tu respuesta? – overexchange

Cuestiones relacionadas