Я пытаюсь получить более полное представление о Scala, и я не могу найти правильную usecase для кода, как показано ниже:
class C extends { def m() { /* ... */ } }
В чем обоснование допуска таких конструкций?
Спасибо!
Ответ 1
Я полагаю, что единственное обоснование здесь - "избегать особых случаев, если это возможно". Вы можете расширить любой класс, анонимный класс - это класс, поэтому вы можете расширить анонимный класс.
Ответ 2
Это не анонимный класс! Это ранний инициализатор, и он работает как часть конструктора, который идет перед его суперклассом.
Цитирование отличного ответа от другого вопроса о стеке_поперед:
abstract class X {
val name: String
val size = name.size
}
class Y extends {
val name = "class Y"
} with X
Если код был написан вместо
class Z extends X {
val name = "class Z"
}
тогда исключение нулевого указателя произойдет, когда Z будет инициализирован, потому что размер инициализируется до имени в обычном порядке инициализации (суперкласс перед классом).
Ответ 3
Он называется Ранние определения, и они имеют дело с проблемой порядка инициализации суперкласса.