Это потому, что абстрактные классы все еще классы и наследование отличается от реализации интерфейса. См. the differences between abstract class and interface. Также см. differences between inplementing an interface and extending a class на Java.
Эти два вопроса охватывают всю информацию, которую вам нужно знать, чтобы понять, почему у вас не может быть множественного наследования абстрактных классов.
позволяют также дать вам пример, почему это не должно быть позволено: Предположим, у вас есть как Animals
и Animals1
реализующий тот же интерфейс IAnimals
:
interface IAnimals
{
public string eat();
}
abstract class Animals implements IAnimals
{
public abstract void run();
public string eat(){ return "Animals eating"; }
}
abstract class Animals1 implements IAnimals
{
public abstract void run1();
public string eat(){ return "Animals1 eating"; }
}
Если теперь определить свой Dog
класс, как вы сделали:
class Dog extends Animals,Animals1
{
public void run() {System.out.println("Run method");}
public void run1() {System.out.println("Run1 method");}
}
он будет иметь метод eat()
тоже, что не является абстрактным, поэтому он может использовать его непосредственно. Каким будет возврат этого метода для собаки? Какая строка будет возвращена, то есть с животными или с животными1?
Это называется diamond problem, и по этой причине на некоторых языках программирования не допускается множественное наследование.
Возможный дубликат [Почему множественное наследование не разрешено на Java или C#?] (Http://stackoverflow.com/questions/995255/why-is-multiple-inheritance-not-allowed-in-java-or- c) – eol
Я знаю, почему множественное наследование не разрешено в java и проблема с алмазом, но если вы видите в примере выше, это просто способ, которым интерфейсы были бы реализованы, поэтому возник вопрос об этом. Питер Лору ответил на это в любом случае :) – Zephyr
Согласен .. см. Мои комментарии ниже. – Abhijit