Scala перегружает конструкторы и супер

Я не могу понять, как разработать код Scala, подобный следующему на Java:

public abstract class A {
   protected A() { ... }
   protected A(int a) { ... }
}

public abstract class B {
   protected B() { super(); }
   protected B(int a) { super(a); }
}

public class C extends B {
   public C() { super(3); }
}

пока понятно как развивать C класс, не могу понять как получить B. Помогите, пожалуйста.

P.S. Я пытаюсь создать свою собственную BaseWebPage, полученную из веб-страницы калитки, что является обычной практикой для Java.


person scorpp    schedule 25.03.2013    source источник


Ответы (1)


Вы имеете в виду что-то вроде:

abstract class A protected (val slot: Int) {
    protected def this() = this(0)
}

abstract class B protected (value: Int) extends A(value) {
    protected def this() = this(0)
}

class C extends B(3) {
}

AFAIK, нет способа обойти первичный конструктор из одной из вторичных форм, т. е. следующее не будет работать:

abstract class B protected (value: Int) extends A(value) {
    protected def this() = super()
}

Все вторичные формы конструктора должны вызывать первичную. Из спецификации языка (5.3.1 Определения конструктора):

Класс может иметь дополнительные конструкторы помимо основного конструктора. Они определяются определениями конструктора формы def this(ps1)...(psn) = e. Такое определение вводит дополнительный конструктор для охватывающего класса с параметрами, указанными в списках формальных параметров ps1, ..., psn, и чье вычисление определяется выражением конструктора e. Областью действия каждого формального параметра являются последующие разделы параметров и выражение конструктора e. Выражение конструктора — это либо вызов самоконструктора this(args1)...(argsn), либо блок, начинающийся с вызова самоконструктора

(выделено мной).

person Dirk    schedule 25.03.2013
comment
спасибо за разъяснение! есть ли способ scala реализовать это? дело не в вызове другого конструктора самого себя, а в суперклассе. - person scorpp; 26.03.2013
comment
Нет. - person OlivierBlanvillain; 16.12.2013