Концепция наследования в Java - PullRequest
2 голосов
/ 18 октября 2010

Привет, я новичок в Java .... перешел от цели c (фон iphone)

все, что мы знаем, что здесь мы не можем использовать множественное наследование ....

альтернативный способинтерфейс ......

мой вопрос ... имеет ли смысл наследование через интерфейсы ... потому что мы должны определить код функции в нашем классе ......Единственная полезная часть здесь - переменные ... это как отдельный класс .h в объекте c ...

Я говорю только о функциях этого интерфейса ... зачем объявлять там ....просто чтобы сохранить две или три строки ... вот и все ..

пожалуйста, скажите, почему нет множественного наследования (простая причина ...).

я знаю, что это может быть плохой вопросспросить, но .........

Я в темноте, пожалуйста, помогите .....

Ответы [ 2 ]

4 голосов
/ 18 октября 2010

Мне нравится этот ответ Стефана Шмидта.он четко объяснил это, http://codemonkeyism.com/java-interview-questions-mutliple-inheritance/

Поддерживает ли Java множественное наследование?

Что ж, очевидно, в Java не существует множественного наследования в классическом смыслеслово.Таким образом, правильный ответ должен быть «нет» или «нет, но» или «да, но».Оттуда можно исследовать несколько способов.В основном я начинаю с вопроса, не слишком ли глупы дизайнеры языка Java для реализации множественного наследования?Почему ребята из C ++ реализовали это тогда?Тогда мы в основном обращаемся к Diamond Anti-Pattern: в объектно-ориентированных языках программирования с множественным наследованием и организацией знаний проблема алмазов - это неоднозначность, которая возникает, когда два класса B и C наследуются от A, а класс D наследуется от B иC. Если метод в D вызывает метод, определенный в A (и не переопределяет метод), и B и C по-разному переопределяют этот метод, то от какого класса он наследуется: B или C?

Другой способ выяснить, как Java «эмулирует» множественное наследование?Ответ, который, возможно, уже появился, это Интерфейсы.Затем мы обычно обсуждаем интерфейсы в Java, если, когда и как кандидат использовал их в прошлом.Для чего хороши интерфейсы, он им нравится?Я могу исследовать, насколько он хорош в моделировании, и иногда заставлять его рисовать диаграммы с интерфейсами.Мы продолжаем с проблемами интерфейсов в Java, и что происходит, когда два интерфейса имеют одинаковые статические поля и класс реализует оба - своего рода «множественное наследование» в Java:

public interface I1 {
   String NAME = "codemonkeyism";
}

public interface I2 {
   String NAME = "stephan";
}

public class C implements I1, I2 {
   public static void main(String[] args) {
      System.out.println(NAME);
   }
}

Оставаясь верным,Разработчик языка решил, что это не работает в Java:

C.java:3: reference to NAME is ambiguous, both variable NAME
              in I1 and variable NAME in I2 match
      System.out.println(NAME);
                         ^
1 error

Есть еще много способов изучить с кандидатом, например, каковы модификаторы методов интерфейса.Являются ли mixins или признаки лучшим решением проблемы diamand, чем интерфейсы?Или они так же плохи, как множественное наследование?Поскольку я больше не очень люблю наследование и думаю, что большинство применений - это запах кода, можно также обсудить обратную сторону наследования - например, связывание между двумя вариантами - с кандидатом.Почему?

Почему я задаю этот вопрос и чему я могу научиться?Наследование является очень базовой концепцией в ОО и должно быть понято каждым разработчиком Java.Размышление о его работе и выход за пределы знания синтаксиса также является важной чертой, поэтому вопрос множественного наследования.Я предпочитаю вопросы, которые порождают много возможностей для изучения.Один из них: вопрос наследования Mutliple, дизайн языка, запахи кода, решения, интерфейсы, ролевая разработка.

2 голосов
/ 18 октября 2010

Я хотел бы добавить что-то к предыдущему ответу.

Как вы поняли из глубокого объяснения, данного 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 позволяет сериализацию и т. Д.

...