Конструктор - это не какая-либо служебная функция, это функция, которая должна гарантировать, что объект полностью инициализируется после его запуска.
Так что если вы вызовете конструктор Car
, он вернет полностью инициализированный Car
в процессе ваш экземпляр должен полностью инициализироваться learnInheritance
, прежде чем вы начнете инициализировать его как Car
. Таким образом, вы должны предположить, что вы можете вызвать только один родительский конструктор.
Чтобы справиться с этим ограничением, вы должны требовать, чтобы был какой-то родительский конструктор, который выполняет всю работу, где все остальные устанавливают некоторые значения по умолчанию. Затем вы можете вызвать этот конструктор самостоятельно с помощью вашего конструктора, который выполняет всю работу, и заставить другие конструкторы действовать как утилиты со значениями по умолчанию.
class Foo(name: String, age: Int) {
def this(name: String) = this(name, 10)
def this(age: Int) = this("", age)
}
class Bar(name: String, age: Int) extends Foo(name, age) {
def this... // bar constructors
}
если вы не можете сделать это, то, к сожалению, вам нужно выбрать только один случай в вашем классе.
В качестве альтернативы, учтите, что каждый случай - это отдельный класс:
class Foo private (name: String, age: Int) {
def this(name: String) = this(name, 10)
def this(age: Int) = this("", age)
}
sealed trait Bar { this: Foo =>
// Bar methods
}
object Bar {
final class Name(name: String) extends Foo(name) with Bar
final class Age(age: Int) extends Foo(age) with Bar
def apply(name: String): Bar = new Name(name)
def apply(age: String): Bar = new Age(age)
}
, но у него есть свои проблемы.
Однако в большинстве случаев Использование только одного родительского конструктора для всего не является проблемой. Если это так, то мы можем найти решение для конкретного случая.