una realiza que puede multiple interfaces implementacion herencia heredar como codigo clases clase java interface multiple-inheritance

realiza - que es herencia en java



¿Cómo simula Java Interfaces herencia múltiple? (21)

¿Sabes qué, desde la perspectiva de un desarrollador de JavaScript tratando de entender qué diablos está pasando con estas cosas, me gustaría señalar un par de cosas y alguien por favor dime qué me falta aquí si estoy muy lejos de la marca.

Las interfaces son realmente simples. Estúpidamente, increíblemente simple. Son tan estúpidamente, increíblemente simples como la gente piensa inicialmente, razón por la cual hay tantas preguntas duplicadas sobre este tema exacto porque la única razón para usarlas ha quedado poco clara por parte de las personas que tratan de hacer más de lo que son y hay es un mal uso generalizado en todas las bases de código del servidor Java al que he estado expuesto.

Entonces, ¿por qué querrías usarlos? La mayoría de las veces no lo harías. Ciertamente no querrás usarlos TODO el tiempo, como muchos parecen pensar. Pero antes de llegar a cuando lo harías, hablemos de lo que NO son.

Las interfaces NO son:

  • de cualquier manera una solución para cualquier tipo de mecanismo de herencia que carece de Java. No tienen nada que ver con la herencia, nunca lo hicieron, y de ninguna manera simulan nada parecido a la herencia.
  • necesariamente algo que te ayude con cosas que escribiste, tanto como ayuda al otro chico a escribir algo para que sea interconectado por tus cosas.

Realmente son tan simples como crees que son a primera vista. Las personas hacen un uso incorrecto de manera estúpida todo el tiempo, por lo que es difícil entender cuál es el punto. Es solo validación / prueba. Una vez que haya escrito que algo se ajusta a una interfaz y funciona, eliminar ese código "implementa" no romperá nada.

Pero si está utilizando interfaces correctamente, no querrá eliminarlo porque tenerlo allí le brinda al próximo desarrollador una herramienta para escribir una capa de acceso para otro conjunto de bases de datos o servicios web que desean que el resto de su aplicación continúe. usando porque saben que su clase fallará hasta que obtengan la interfaz 100% completa como se esperaba. Todas las interfaces lo hacen, valida su clase y establece que de hecho ha implementado una interfaz como prometió. Nada mas.

También son portátiles. Al exponer las definiciones de su interfaz, puede darles a las personas que deseen utilizar su código no expuesto un conjunto de métodos para que sus objetos lo utilicen correctamente. No tienen que implementar las interfaces. Podrían anotarlos en un pedazo de papel de bloc de notas y verificarlo dos veces. Pero con la interfaz tiene más garantías de que nada va a intentar funcionar hasta que tenga una versión adecuada de la interfaz en cuestión.

Entonces, ¿alguna interfaz que probablemente nunca se implementará más de una vez? Completamente inutil. ¿Herencia múltiple? Deja de alcanzar ese arcoiris. Java los evita por una razón, en primer lugar, y los objetos compuestos / agregados son más flexibles en muchos sentidos de todos modos. Eso no quiere decir que las interfaces no puedan ayudarlo a modelar de manera que la herencia múltiple lo permita, pero en realidad no es herencia de ninguna forma o forma y no debería verse como tal. Solo garantiza que su código no funcionará hasta que haya implementado todos los métodos que estableció que lo haría.

Estoy leyendo "The Java Tutorial" (por segunda vez). Acabo de pasar por la sección sobre Interfaces (nuevamente), pero todavía no entiendo cómo las interfaces Java simulan herencia múltiple. ¿Hay una explicación más clara que la que está en el libro?


Aquí hay una manera de lograr herencia múltiple a través de interfaces en java.

¿Qué lograr?
la clase A extiende B, C // esto no es posible en Java directamente, pero se puede lograr indirectamente.

class B{ public void getValueB(){} } class C{ public void getValueC(){} } interface cInterface{ public getValueC(); } class cChild extends C implemets cInterface{ public getValueC(){ // implementation goes here, call the super class''s getValueC(); } } // Below code is **like** class A extends B, C class A extends B implements cInterface{ cInterface child = new cChild(); child.getValueC(); }


Debes ser preciso:

Java permite la herencia múltiple de la interfaz, pero solo la herencia única de la implementación.

Usted hace herencia múltiple de la interfaz en Java de esta manera:

public interface Foo { String getX(); } public interface Bar { String getY(); } public class MultipleInterfaces implements Foo, Bar { private Foo foo; private Bar bar; public MultipleInterfaces(Foo foo, Bar bar) { this.foo = foo; this.bar = bar; } public String getX() { return this.foo.getX(); } public String getY() { return this.bar.getY(); } }


Ellos no.

Creo que la confusión proviene de personas que creen que implementar una interfaz constituye alguna forma de herencia. No es así; la implementación puede simplemente estar en blanco, ningún comportamiento es forzado por el acto o garantizado a través de ningún contrato. Un ejemplo típico es la interfaz Clonable, que aunque alude a una gran funcionalidad, que define tan poco es esencialmente inútil y potencialmente peligrosa.

¿Qué heredas al implementar una interfaz? ¡Bubkes! Entonces, en mi opinión, deje de usar las palabras interfaz y herencia en la misma oración. Como dijo Michael Borgwardt, una interfaz no es una definición sino un aspecto.


En realidad, puede "heredar" de varias clases concretas si implementan interfaces por sí mismas. innerclasses te ayudan a lograr eso:

interface IBird { public void layEgg(); } interface IMammal { public void giveMilk(); } class Bird implements IBird{ public void layEgg() { System.out.println("Laying eggs..."); } } class Mammal implements IMammal { public void giveMilk() { System.out.println("Giving milk..."); } } class Platypus implements IMammal, IBird { private class LayingEggAnimal extends Bird {} private class GivingMilkAnimal extends Mammal {} private LayingEggAnimal layingEggAnimal = new LayingEggAnimal(); private GivingMilkAnimal givingMilkAnimal = new GivingMilkAnimal(); @Override public void layEgg() { layingEggAnimal.layEgg(); } @Override public void giveMilk() { givingMilkAnimal.giveMilk(); } }


Es bastante simple. Puede implementar más de una interfaz en un tipo. Entonces, por ejemplo, podría tener una implementación de List que también sea una instancia de Deque (y Java sí ... LinkedList ).

Simplemente no puede heredar implementaciones de múltiples padres (es decir, extender múltiples clases). Las declaraciones (firmas de métodos) no son un problema.


Hay casos en que la herencia múltiple resulta ser muy útil y difícil de reemplazar con interfaces sin escribir más código. Por ejemplo, hay aplicaciones de Android que usan clases derivadas de Activity y otras de FragmentActivity en la misma aplicación. Si tiene una característica en particular que desea compartir en una clase común, en Java tendrá que duplicar el código en lugar de dejar que las clases secundarias de Activity y FragmentsActivity deriven de la misma clase SharedFeature. Y la pobre implementación de genéricos en Java tampoco ayuda, porque escribir lo siguiente es ilegal:

public class SharedFeature<T> extends <T extends Activity> ... ...


Las interfaces no simulan herencia múltiple. Los creadores de Java consideraron que la herencia múltiple es incorrecta, por lo que no existe tal cosa en Java.

Si desea combinar la funcionalidad de dos clases en una composición de objetos de uso único. Es decir

public class Main { private Component1 component1 = new Component1(); private Component2 component2 = new Component2(); }

Y si desea exponer ciertos métodos, defínalos y permítales delegar la llamada al controlador correspondiente.

Aquí las interfaces pueden ser útiles: si Component1 implementa la interfaz Interface1 y Component2 implementa Interface2 , puede definir

class Main implements Interface1, Interface2

Para que pueda usar objetos intercambiablemente donde el contexto lo permita.


Me gustaría señalar algo que me mordió por detrás, viniendo de C ++ donde también puedes heredar fácilmente muchas implementaciones.

Tener una interfaz "amplia" con muchos métodos significa que deberá implementar muchos métodos en sus clases concretas y no podrá compartirlos fácilmente entre implementaciones.

Por ejemplo:

interface Herbivore { void munch(Vegetable v); }; interface Carnivore { void devour(Prey p); } interface AllEater : public Herbivore, Carnivore { }; class Fox implements AllEater { ... }; class Bear implements AllEater { ... };

En este ejemplo, Fox y Bear no pueden compartir una implementación base común para sus métodos de interfaz munch y devour .

Si las implementaciones base se ven así, tal vez querríamos usarlas para Fox y Bear :

class ForestHerbivore implements Herbivore void munch(Vegetable v) { ... } }; class ForestCarnivore implements Carnivore void devour(Prey p) { ... } };

Pero no podemos heredar ambos. Las implementaciones base deben ser variables miembro en la clase y los métodos definidos pueden reenviarse a eso. Es decir:

class Fox implements AllEater { private ForestHerbivore m_herbivore; private ForestCarnivore m_carnivore; void munch(Vegetable v) { m_herbivore.munch(v); } void devour(Prey p) { m_carnivore.devour(p); } }

Esto se vuelve difícil de manejar si las interfaces crecen (es decir, más de 5-10 métodos ...)

Un mejor enfoque es definir una interfaz como una agregación de interfaces:

interface AllEater { Herbivore asHerbivore(); Carnivore asCarnivore(); }

Esto significa que Fox y Bear solo tienen que implementar estos dos métodos, y las interfaces y las clases base pueden crecer independientemente de la interfaz agregada de AllEater que concierne a las clases de implementación.

Menos acoplamiento de esta manera, si funciona para su aplicación.


No creo que lo hagan.

La herencia es específicamente una relación orientada a la implementación entre implementaciones. Las interfaces no proporcionan ninguna información de implementación en absoluto, sino que definen un tipo. Para tener herencia, debe heredar específicamente algunos comportamientos o atributos de una clase principal.

Creo que hay una pregunta aquí en algún lugar específicamente sobre el papel de las interfaces y la herencia múltiple, pero no puedo encontrarlo ahora ...


No es justo decir que las interfaces ''simulan'' herencia múltiple.

Claro, su tipo puede implementar múltiples interfaces y actuar polimórficamente como muchos tipos diferentes. Sin embargo, obviamente no heredará comportamientos o implementaciones bajo esta disposición.

En general, observe la composición en la que cree que puede necesitar herencia múltiple.

O una posible solución para lograr algo así como herencia múltiple es la interfaz de Mixin - http://csis.pace.edu/~bergin/patterns/multipleinheritance.html . ¡Use con cuidado!


No es una simulación de herencia múltiple. En Java no puedes heredar de dos clases, pero si implementas dos interfaces "parece que heredaste de dos clases diferentes" porque puedes usar tu clase como cualquiera de tus dos intefaces.

Por ejemplo

interface MyFirstInteface{ void method1(); } interface MySecondInteface{ void method2(); } class MyClass implements MyFirstInteface, MySecondInteface{ public void method1(){ //Method 1 } public void method2(){ //Method 2 } public static void main(String... args){ MyFirstInterface mfi = new MyClass(); MySecondInterface msi = new MyClass(); } }

Esto funcionará y puedes usar mfi y msi, parece una herencia múltiple, pero no es porque no heredes nada, solo reescribes los métodos públicos proporcionados por las interfaces.


No hay soporte para herencia múltiple en java.

Esta historia de compatibilidad con la herencia múltiple a través de la interfaz es lo que los desarrolladores preparamos. La interfaz proporciona flexibilidad que las clases concretas y tenemos la opción de implementar múltiples interfaces usando una sola clase. Esto es por acuerdo, nos estamos adhiriendo a dos planos para crear una clase.

Esto está tratando de acercarse a la herencia múltiple. Lo que hacemos es implementar una interfaz múltiple, aquí no estamos ampliando (heredando) nada. La clase de implementación es la que va a agregar las propiedades y el comportamiento. No está obteniendo la implementación gratis de las clases principales. Simplemente diría que no hay soporte para herencia múltiple en java.



Por cierto, la razón por la que Java no implementa una herencia múltiple completa es porque crea ambigüedades. Supongamos que puede decir "A extiende B, C", y luego tanto B como C tienen la función "void f (int)". ¿Qué implementación hereda A? Con el enfoque de Java, puede implementar cualquier cantidad de interfaces, pero las interfaces solo declaran una firma. Entonces, si dos interfaces incluyen funciones con la misma firma, bien, su clase debe implementar una función con esa firma. Si las interfaces que hereda tienen funciones con firmas diferentes, entonces las funciones no tienen nada que ver entre sí, por lo que no se trata de un conflicto.

No digo que esta sea la única forma. C ++ implementa la herencia múltiple verdadera estableciendo reglas de precedencia de las cuales la implementación gana. Pero los autores de Java decidieron eliminar la ambigüedad. Ya sea por una creencia filosófica de que esto hizo un código más limpio, o porque no querían hacer todo el trabajo extra, no lo sé.


Probablemente esté confundido porque ve herencia múltiple localmente, en términos de una clase heredando detalles de implementación de múltiples padres. Esto no es posible en Java (y a menudo conduce a abusos en los idiomas donde es posible).

Las interfaces permiten la herencia múltiple de tipos , por ejemplo, una class Waterfowl extends Bird implements Swimmer puede ser utilizado por otras clases como si fuera un Bird y como si fuera un Swimmer . Este es el significado más profundo de la herencia múltiple: permitir que un objeto actúe como si perteneciera a varias clases diferentes no relacionadas a la vez.


Realmente no hay simulación de herencia múltiple en Java.

La gente a veces dice que puedes simular herencia múltiple usando Interfaces porque puedes implementar más de una interfaz por clase y luego usar composición (en lugar de herencia) en tu clase para lograr los comportamientos de las múltiples clases que intentabas heredar de para empezar.


Si tiene sentido en su modelo de objeto, puede, por supuesto, heredar de una clase e implementar 1 o más interfaces también.


Supongamos que tiene 2 tipos de cosas en su dominio: Camiones y cocinas

Los camiones tienen un método driveTo () y cocina un método cook ().

Ahora supongamos que Pauli decide vender pizzas desde la parte trasera de un camión de reparto. Él quiere algo donde pueda conducir a () y cocinar () con.

En C ++ usaría herencia múltiple para hacer esto.

En Java se consideró que era demasiado peligroso, por lo que puede heredar de una clase principal, pero puede "heredar" los comportamientos de las interfaces, que son para todos los efectos clases abstractas sin campos o implementaciones de métodos.

Entonces en Java tendemos a implementar herencia múltiple usando delegaciones:

Pauli subclasifica un camión y agrega una cocina al camión en una variable miembro llamada cocina. Implementa la interfaz Kitchen al llamar a kitchen.cook ().

class PizzaTruck extends Truck implements Kitchen { Kitchen kitchen; public void cook(Food foodItem) { kitchen.cook(foodItem); } }

Él es un hombre feliz porque ahora puede hacer cosas como;

pizzaTruck.driveTo(beach); pizzaTruck.cook(pizzaWithExtraAnchovies);

Ok, esta historia tonta fue para demostrar que no es una simulación de herencia múltiple, es una herencia múltiple real con la condición de que solo se puede heredar el contrato, solo heredar de clases base abstractas vacías que se llaman interfaces.

(Actualización: con la llegada de los métodos por defecto, las interfaces ahora también pueden proporcionar algún comportamiento para ser heredado)


También debo decir que Java no es compatible con herencia múltiple.

Debe diferenciar el significado entre extends e implements palabras clave en Java. Si usamos extends , en realidad estamos heredando la clase después de esa palabra clave. Pero, para hacer todo simple, no podemos usar se extends más de una vez. Pero puede implementar tantas interfaces como desee.

Si implementa una interfaz, existe la posibilidad cero de que omita la implementación de todos los métodos en cada interfaz (Excepción: implementaciones predeterminadas de los métodos de interfaz introducidos en Java 8). Por lo tanto, ahora es plenamente consciente de lo que está sucediendo con las cosas que has incorporado a tu nueva clase.

Por qué Java no permite la herencia múltiple es en realidad, la herencia múltiple hace que el código sea algo complejo. A veces, dos métodos de clases principales pueden entrar en conflicto debido a tener las mismas firmas. Pero si se ve obligado a implementar todos los métodos de forma manual, obtendrá una comprensión completa de lo que está sucediendo, como mencioné anteriormente. Hace que tu código sea más comprensible para ti.

Si necesita más información sobre las interfaces Java, consulte este artículo, http://www.geek-programmer.com/introduction-to-java-interfaces/


dadas las dos interfaces a continuación ...

interface I1 { abstract void test(int i); } interface I2 { abstract void test(String s); }

Podemos implementar ambos mediante el siguiente código ...

public class MultInterfaces implements I1, I2 { public void test(int i) { System.out.println("In MultInterfaces.I1.test"); } public void test(String s) { System.out.println("In MultInterfaces.I2.test"); } public static void main(String[] a) { MultInterfaces t = new MultInterfaces(); t.test(42); t.test("Hello"); } }

NO PODEMOS extender dos objetos, pero podemos implementar dos interfaces.