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