Не могу ли я определить значения по умолчанию, если я определю несколько перегруженных конструкторов в Scala? - PullRequest
14 голосов
/ 10 октября 2010

Я определил несколько конструкторов с некоторыми значениями аргументов по умолчанию во всех них.Выглядит правильно (я не вижу никакой двусмысленности), но компилятор Scala (2.8) жалуется:

несколько перегруженных альтернатив конструктора определяют аргументы по умолчанию

Означает ли это, чтоЯ вообще не могу определить значения по умолчанию для перегруженных конструкторов?

Позвольте мне проиллюстрировать ситуацию (конечно, примитивную, но иллюстративную):


class A(subject : Double, factor : Int = 1, doItRight : Boolean = true) {

  def this (subject : Int, factor : Int = 1, doItRight : Boolean = true) = {
    this(subject.toDouble , factor, doItRight)
  }

  def this (subject : String, factor : Int = 1, doItRight : Boolean = true) = {
    this(subject.toDouble , factor, doItRight)
  }

  def this () = {
    this(defaultSubject)
  }

}



Ответы [ 2 ]

9 голосов
/ 10 октября 2010

Взят прямо из исходного кода компилятора:

// only one overloaded alternative is allowed to define default arguments

В общем, я бы не советовал смешивать перегрузки и значения по умолчанию. Даже если нет конфликта, это может затруднить чтение вашего кода.

UPDATE

Поскольку вы добавили код, теперь ясно, что вам не нужно / не нужно переопределять значения по умолчанию для каждого вторичного конструктора. В вашем конкретном случае я могу даже поставить под сомнение необходимость этих дополнительных конструкторов вообще; Int => Double уже доступен для вас как неявное преобразование, а String => Double выглядит так, как будто вы извращаете систему типов:)

Также ... В качестве альтернативы перегруженным конструкторам вы можете определить только основной конструктор со значениями по умолчанию, затем перегрузить метод apply объекта-компаньона и использовать его в качестве фабрики. Это, конечно, совершенно необязательно, но оно быстро становится общепринятым в качестве шаблона благодаря использованию case-классов.

4 голосов
/ 10 октября 2010

Сбой перегрузки, потому что вы (необязательно) определяете несколько конструкторов со значениями по умолчанию Сделайте это вместо:

class A(subject : Double, factor : Int = 1, doItRight : Boolean = true) {

  def this (subject : Int) = {
    this(subject.toDouble)
  }

  def this (subject : String) = {
    this(subject.toDouble)
  }

  def this () = {
    this(defaultSubject)
  }
}
...