Можно ли перегружать конструкторы в scala? - PullRequest
3 голосов
/ 25 сентября 2010

Мой вопрос: возможно ли перегрузить конструкторы в scala?

Так что я могу написать код вроде:

var = new Foo(1)
var = new Foo("bar")

А если это невозможно, есть ли эквивалентные трюки?

Ответы [ 3 ]

9 голосов
/ 25 сентября 2010

Конечно, но есть ограничения. Scala требует, чтобы один из ваших конструкторов был «первичным». Основной конструктор имеет специальный удобный синтаксис размещения аргументов конструктора сразу после имени класса. Другие «вторичные» конструкторы также могут быть определены, но они должны вызывать первичный конструктор. Это отличается от Java и несколько более ограничено. Это делается таким образом, что аргументы конструктора могут рассматриваться как поля.

Ваш пример будет выглядеть как

class Foo(myArg:String){ //primary constructor
   def this(myIntArg:Int) = this(myIntArg.toString) //secondary constructor
}

val x = new Foo(1)
val y = new Foo("bar")
6 голосов
/ 25 сентября 2010

Как вы можете видеть на примере Дейва Гриффита, первичный конструктор должен быть «самым общим» в том смысле, что любой другой конструктор должен вызывать его (прямо или косвенно). Как вы можете себе представить, это иногда приводит к уродливым первичным конструкторам. Обычная стратегия - использовать объект-компаньон, чтобы скрыть безобразие (и вам не нужно вводить «новый»):

class Foo private (arg:Either[String, Int]){ 
   ...
}

object Foo {
   def apply(arg:String) = new Foo(Left(arg))
   def apply(arg:Int) = new Foo(Right(arg))  
}

val a = Foo(42)
val b = Foo("answer")

Конечно, вы должны быть осторожны, если хотите наследовать от своего класса (например, это невозможно в примере выше)

0 голосов
/ 25 июля 2017
class MyCons{    

  def this(msg:String){    
        this()    
        println(msg)   
  }       

  def this(msg1:String , msg2:String){    
        this()    
        println(msg1 +" "+msg2)    
  }    

}   

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

...