Я хотел бы добавить что-то к предыдущему ответу.
Как вы поняли из глубокого объяснения, данного Tilsan, множественное наследование Fighter не поддерживается Java.
В качестве альтернативы вы должны использовать один из шаблонов проектирования делегирования. Я знаю, что иногда код выглядит более многословно, чем код, выполненный с использованием множественного наследования, но это цена, которую мы должны заплатить.
Вы задали вопрос, почему вам нужно создать класс, который реализует более одного интерфейса? Я бы задал вам вопрос, зачем вам вообще нужен интерфейс? Я думаю, что ответ заключается в том, что это позволяет вам отделить интерфейс (контракт) от конкретной реализации, сделать модули независимыми, упростить рефакторинг и сделать программы более гибкими: вы можете переключать реализации, только если конкретная реализация скрыта интерфейсом. *
Если ваш класс может использоваться в разных контекстах как A и B (где A и B - интерфейсы), класс должен реализовывать 2 интерфейса.
Пример: предположим, что у вас есть бизнес-интерфейс Foo, который объявляет только один метод
int foo(String str);
Теперь вы создаете пару классов A и B, которые реализуют Foo:
public class A implements Foo {
public int foo(String s) {
return s.length();
}
}
public class B implements Foo {
public int foo(String s) {
return s.hashCode();
}
}
Теперь вы хотите создать коллекцию Foo:
Collection<Foo> collection = new ArrayList<Foo>();
collection.add(new A());
collection.add(new B());
Код, использующий эту коллекцию, ничего не знает о конкретной реализации, но не мешает вызывать foo ().
Теперь вы хотите отсортировать эту коллекцию. Один из способов - реализовать еще один интерфейс. Comparable:
public class A implements Foo, Comparable<Foo> {
public int foo(String s) {
return s.length();
}
public int compareTo(Foo o) {
return getClass().getName().compareTo(o.getClass().getName());
}
}
Когда вы закончите, вы можете сказать:
Collections.sort(collection);
И коллекция будет отсортирована в соответствии с правилом, определенным в compareTo ().
Теперь вы, вероятно, захотите сериализовать экземпляры A и B. Для этого вам нужно реализовать еще один интерфейс Serializable. К счастью, Serializable - это специальный интерфейс, который не объявляет какой-либо метод. JVM знает, что нужно сериализовать и десериализовать объекты, которые являются экземплярами Serializable.
public class A implements Foo, Comparable<Foo>, Serializable {
public int foo(String s) {
return s.length();
}
public int compareTo(Foo o) {
return getClass().getName().compareTo(o.getClass().getName());
}
}
Класс B выглядит так же.
Теперь мы можем сказать:
DataOutputStream os = new DataOutputStream(new FileOutputStream("/tmp/foo.dat"));
os.writeObject(new A());
os.writeObject(new B());
os.flush();
os.close();
и сохраняем наши объекты в файле /tmp/foo.dat
. Мы можем прочитать объекты позже.
Я попытался показать, зачем нам классы, которые реализуют несколько интерфейсов: каждый интерфейс дает классу свое поведение. Comparable позволяет сортировать коллекции таких экземпляров. Serializable позволяет сериализацию и т. Д.