Разница в использовании многоуровневого наследования в scala и использовании всех уровней в 1 уровне с помощью ключевого слова «with» - PullRequest
2 голосов
/ 13 июня 2019

Я - Java-разработчик и недавно изучил scala.Кто-нибудь может помочь понять эту путаницу.

Предположим, у меня ниже структура кода.

abstract class A {
  val message: String
}
class B extends A {
  val message = "I'm an instance of class B"
}
trait C extends A {
  def loudMessage = {message.toUpperCase()}
}
class D extends B with C

Теперь вопрос о последней строке кода: когда мы расширяем класс B в D, B уже содержит членов класса A. Почему мы должны писать так?Есть ли разница?

Большое спасибо за то, что даже прочитали мой вопрос.Для человека, который думает и отвечает, снимаю шляпу.

1 Ответ

1 голос
/ 16 июня 2019

Нет никакой разницы, так как, расширяя класс B, вы получили часть сообщения, далее микширование в черте C, которая также нуждалась в сообщении, но у нас уже есть это от B, и теперь у нас также есть loudMessage от C.

Скопировано из Википедии -

класс может наследовать только от одного класса, но может смешивать столько признаков, сколько пожелает.Scala разрешает имена методов, используя поиск по расширенным «чертам» по принципу «сначала в глубину», прежде чем исключить все, кроме последнего, вхождения каждого модуля в результирующем списке.

это решает проблему алмазов (кратнонаследование).

Это общая практика - писать черты и смешивать их в своих классах, когда это необходимо, вы найдете их интересными при написании модульных тестов, создаете много поддельных данных / насмешек в чертах исмешивать их в любое время.

...