2010-01-09 14 views
15

duplicados posibles:
Cheat single inheritance in Java !!
Why is Multiple Inheritance not allowed in Java or C#?
Multiple Inheritance in java.¿Cómo heredar de varias clases base en Java?

Sé que podemos usar interfaces para heredar de múltiples clases, pero ¿es posible heredar el estado así?
¿Cómo puedo heredar los métodos con definiciones de 2 clases y tenerlos en una tercera clase en Java?

+0

Posibles duplicados: http://stackoverflow.com/questions/1262447/multiple-inheritance-in-java, http://stackoverflow.com/questions/1038314/alternative-of-multiple-inheritance-in-java, http://stackoverflow.com/questions/995255/why-is-multiple-inheritance-not-allowed-in-java-or-c, http://stackoverflow.com/questions/70537/cheat-single-inheritance- en-java, etc., etc. –

+0

Esas otras preguntas no son IMO duplicados. Esas preguntas preguntan * por qué * no hay herencia múltiple. Esta pregunta pregunta cómo evitarlo, con respuestas adecuadas siempre que las otras preguntas no proporcionen. – HDave

Respuesta

23

Respuesta corta: No se puede. Java solo tiene herencia múltiple de interfaces.

respuesta Ligeramente más largo: Si se asegura de los métodos que nos interesan están en las interfaces, entonces puede tener una clase que implementa las interfaces, y luego los delegados a las instancias de las "clases súper":

interface Noisy { 
    void makeNoise(); 
} 


interface Vehicle { 
    void go(int distance); 
} 

class Truck implements Vehicle { 
    ... 
} 

class Siren implements Noisy { 
    ... 
} 

class Ambulance extends Truck implements Noisy { 
    private Siren siren = new Siren(); 

    public makeNoise() { 
    siren.makeNoise(); 
    } 

    ... 
} 
2

Java explícitamente no permite la herencia múltiple de la implementación. Te queda el uso de interfaces y composición para lograr resultados similares.

+0

que Laurence ha proporcionado un gran ejemplo de :) –

3

No se puede, Java no es compatible con herencia múltiple. Lo que podrías hacer es composición.

25

La herencia múltiple no está permitida en Java. Utilizar delegados e interfaces en lugar

public interface AInterface { 
     public void a(); 
} 
public interface BInterface { 
    public void b(); 
} 

public class A implements AInterface { 
    public void a() {} 
} 
public class B implements BInterface { 
    public void b() {} 
} 

public class C implements AInterface, BInterface { 
    private A a; 
    private B b; 

    public void a() { 
     a.a(); 
    } 
    public void b() { 
     b.b(); 
    } 
} 

Desde Java 8 que es posible utilizar Default Methods en Interfaces.