Типичной проблемой объектно-ориентированного программирования является проблема алмаза. У меня есть родительский класс A с двумя подклассами B и C. A имеет абстрактный метод, B и C реализуют его. Теперь у меня есть подкласс D, который наследует B и C. Проблема с алмазами теперь заключается в том, какую реализацию должен использовать D, одну из B или одну из C?
Люди утверждают, что Java не знает проблем с алмазами. У меня может быть множественное наследование только с интерфейсами, и, поскольку у них нет реализации, у меня нет проблемы с бриллиантами. Это правда? Я так не думаю. См. ниже:
[удален пример автомобиля]
Всегда ли алмазная проблема является причиной плохого дизайна классов и что-то, что не нужно решать ни программисту, ни компилятору, потому что она вообще не должна существовать?
Обновление: возможно, мой пример был выбран неудачно.
Посмотреть это изображение
(источник: suffolk.edu)
Конечно, вы можете сделать Person виртуальным в C++, и, таким образом, у вас будет только один экземпляр человека в памяти, но реальная проблема сохраняется IMHO. Как бы вы реализовали getDepartment() для GradTeachingFellow? Подумайте, он может быть студентом на одном факультете и преподавать на другом. Таким образом, вы можете либо вернуть один отдел, либо другой; нет идеального решения проблемы, и тот факт, что никакая реализация не может быть унаследована (например, ученик и учитель могут быть интерфейсами), мне кажется, не решает проблему.