Ромбовидное наследование в java - Вопросы по Java

Вопрос Ромбовидное наследование в java

Регистрация
16 Дек 2013
Сообщения
89
Репутация
10
Спасибо
2
Монет
0
Что это такое и в чем плюсы/минусы? Прошу объяснить максимально простыми словами.
 
Регистрация
28 Сен 2013
Сообщения
82
Репутация
0
Спасибо
0
Монет
0
На схеме стрелки между классами образуют ромб:
6638036_bc34eccc84b23986d5eab9dad103e71c_800.png

Класс D имеет сразу двух предков - B и C.

Это также называется множественным наследованием, когда один класс имеет несколько предков (суперклассов).

Множественное наследование не предусмотрено в Java во избежание конфликтов между реализациями методов разных предков с одинаковой сигнатурой. Какой из них вызывается у потомка, непонятно.

Зато Java позволяет одному классу реализовать множество интерфейсов.
 
Регистрация
14 Сен 2012
Сообщения
81
Репутация
0
Спасибо
0
Монет
0
Ромбовидное наследование возникает, когда класс наследуется от двух родительских классов, которые в свою очередь наследуются от общего базового класса. Например: class A {
// ...
}

class B extends A {
// ...
}

class C extends A {
// ...
}

class D extends B, C {
// ...
} Здесь класс D наследуется от B и C, которые наследуются от общего родительского класса A. Это и создает структуру в виде ромба.

Плюсы:

- Повторное использование кода - класс D получает функциональность и от B, и от C
- Гибкость иерархии классов

Минусы:

- Неоднозначность - если в классах B и C есть одинаковые методы, в классе D это приведет к конфликту
- Усложнение иерархии - трудно разобраться при большом количестве классов

Чтобы избежать проблем, нужно тщательно продумывать иерархию классов и использовать интерфейсы для разделения общих методов.
 
Регистрация
12 Авг 2013
Сообщения
84
Репутация
0
Спасибо
0
Монет
0
В Java не существует "ромбовидного наследования" - т.к. не существует "множественного наследования", приводящего к появлению неоднозначности: когда один и тот же класс может встретиться в нескольких цепочках классов-предков.

С "ромбовидным наследованием" ты столкнёшься, если перейдёшь с Java на C++.
 
Сверху Снизу