Коли він каже, що Скала не підтримує багатократне успадкування, то він посилається на успадкування реалізації методу кілька разів. Звичайно, ви можете реалізувати декілька інтерфейсів / ознак у класі, і вони можуть навіть визначити один і той же метод, але у вас не виникає конфлікт між різними реалізаціями через лінеаризацію ознак.
Загалом, якщо у вас є клас C1
із методом, f()
а клас C2
також із методом f()
, то множинне успадкування означає, що ви можете якось успадкувати обидві реалізації f()
. Це може призвести до різних проблем, які Скала вирішує, лише дозволяючи вам успадковувати з одного класу, а у випадку декількох ознак, вибираючи одну реалізацію на основі порядку ознак.
Що стосується Nothing
справді просто, тому що нічого не визначено атрибутами чи методами. Таким чином, у вас не може бути конфліктів щодо спадщини. Але я припускаю, що більшість ваших сюрпризів відбувається від іншого розуміння багаторазового успадкування.
Після того, як ви зрозумієте, що лінеаризація ознак ефективно усуває будь-яку неоднозначність спадкування, і що ми не називаємо спадкування з декількох ознак як множинне успадкування через це, то вам слід добре.
Щодо того, як це реалізується: компілятор, зрештою, відповідає за це. Див. Розділ 3.5.2 специфікації мови Scala , який серед інших властивостей включає:
For every type constructor T (with any number of type parameters), scala.Nothing <: T <: scala.Any.
Або іншими словами, якщо ви хочете правильно реалізувати компілятор, він повинен обробляти Nothing
як підтип всього за специфікацією. З очевидних причин Nothing
не визначено, щоб поширюватися на всі класи, завантажені в систему, але релевантність визначення Nothing
як підтипу обмежена всіма місцями, де підтипування має значення.
Важливим моментом тут є те, що не існує жодного примірника типу Nothing
, отже, його обробка суворо обмежена перевіркою типу, що є всіма у сфері компілятора.