2010-01-09 1 views
15

Возможные Дубликаты:
Cheat single inheritance in Java !!
Why is Multiple Inheritance not allowed in Java or C#?
Multiple Inheritance in java.Как наследовать от нескольких базовых классов в Java?

Я знаю, что мы можем использовать интерфейсы наследовать от нескольких классов, но это возможно, чтобы наследовать состояние, а?
Как я могу наследовать методы с определениями из 2 классов и иметь их в третьем классе в Java?

+0

Возможные дубликаты: 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- in-java и т. д. и т. д. –

+0

Эти другие вопросы не дублируют ИМО. Эти вопросы задают * почему * нет множественного наследования. Этот вопрос спрашивает, как обойти это - с подходящими ответами при условии, что другие вопросы не предусмотрены. – HDave

ответ

23

Короткий ответ: вы не можете. Java имеет только множественное наследование интерфейсов.

Слегка развернутый ответ: Если вы убедитесь, что методы, которые вы заботитесь о в интерфейсах, то вы можете иметь класс, который реализует интерфейс, а затем делегатов экземплярами «супер классов»:

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 явно запрещает множественное наследование реализации. Вы можете использовать интерфейсы и состав для достижения аналогичных результатов.

+0

Какой Лоуренс предоставил отличный пример :) –

3

Вы не можете, Java не поддерживает множественное наследование. Что вы можете сделать, это композиция.

25

Множественное наследование не допускается на Java. Использование делегатов и интерфейсов вместо

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(); 
    } 
} 

Поскольку Java 8, что можно использовать Default Methods в интерфейсах.