(Примечание: я использовал «error» вместо «problem» в названии по понятным причинам ..;)).
Я немного изучил черты характера в Scala. Они похожи на интерфейсы в Java или C #, но допускают реализацию метода по умолчанию.
Мне было интересно: не может ли это привести к «проблеме алмазов», поэтому многие языки избегают множественного наследования?
Если да, то как Scala справляется с этим?
scala
multiple-inheritance
Авив Кон
источник
источник
Ответы:
Проблема алмазов заключается в невозможности решить, какую реализацию метода выбрать. Scala решает эту проблему, определяя, какую реализацию выбрать в рамках языковых спецификаций (см. Часть о Scala в этой статье Википедии ).
Конечно, то же самое определение порядка может также использоваться в множественном наследовании класса, так зачем беспокоиться о чертах?
Причиной ИМО являются конструкторы. Конструкторы имеют несколько ограничений, которых нет у обычных методов - их можно вызывать только один раз для каждого объекта, их нужно вызывать для каждого нового объекта, а конструктор дочернего класса должен вызывать конструктор своего родителя в качестве первой инструкции (большинство языков сделайте это неявно для вас, если вам не нужно передавать параметры).
Если B и C наследуют A и D наследуют B и C, и оба конструктора B и C вызывают конструктор A, тогда конструктор D дважды вызовет конструктор A. Определение того, какую реализацию выбрать, как это делал Scala с методами, здесь не сработает, потому что должны вызываться как конструкторы B, так и C.
Черты избегают этой проблемы, так как у них нет конструкторов.
источник
Scala избегает алмазной проблемы с помощью так называемой «черты линеаризации». По сути, он ищет реализацию метода по признакам, которые вы расширяете справа налево. Простой пример:
Тем не менее, список черт, которые он ищет, может содержать больше, чем те, которые вы явно указали, поскольку они могут расширять другие черты. Подробное объяснение дано здесь: черты как составные модификации и более полный пример линеаризации здесь: почему не множественное наследование?
Я полагаю, что в других языках программирования такое поведение иногда называют «порядком разрешения методов» или «MRO».
источник