Наследует ли расширение класса в scala вспомогательный конструктор? - PullRequest
0 голосов
/ 29 апреля 2020

Я пытаюсь расширить класс, который имеет основной и вспомогательный конструктор. У моего базового класса есть доступ к вспомогательным конструкторам

class learnInheritance (speed:Int) {


  val mph: Int = speed
  def race() = println("Racing")

  def this (speed:Int, model:String) {
    this(speed)
    println("Speed of call is " + speed + "and model is " + model)
  }

}

class Car(speed:Int)  extends learnInheritance(speed) {

   override val mph: Int = speed
   override def race() = println("Racing Car")

}

val a = new Car(10,"Maruti")
println("Speed of Car: " + a.mph)
a.race()

Ответы [ 2 ]

2 голосов
/ 29 апреля 2020

Конструкторы не являются методами экземпляра. Это означает, что они не наследуются.

2 голосов
/ 29 апреля 2020

Конструктор - это не какая-либо служебная функция, это функция, которая должна гарантировать, что объект полностью инициализируется после его запуска.

Так что если вы вызовете конструктор 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)
}

, но у него есть свои проблемы.

Однако в большинстве случаев Использование только одного родительского конструктора для всего не является проблемой. Если это так, то мы можем найти решение для конкретного случая.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...