Какой случай использования вторичных конструкторов в абстрактных классах? - PullRequest
14 голосов
/ 31 августа 2011

Рассмотрим этот код:

abstract class Foo(val s: String) {
  def this(i: Int) = this("" + (i+2))
}

Насколько я понимаю, конструкторы не наследуются, и вторичные конструкторы нельзя вызывать из подклассов с super, как в Java.просто бесполезный артефакт или есть какой-то разумный вариант использования этой конструкции?

Ответы [ 3 ]

17 голосов
/ 31 августа 2011
scala> object Bar extends Foo(3)
defined module Bar

scala> Bar.s
res3: String = 5
11 голосов
/ 31 августа 2011

Основной конструктор подкласса должен вызывать один из конструкторов суперкласса, не обязательно основной.

abstract class A(s: String) {
  def this(i: Int) = this(i.toString)
}
class B(i: Int) extends A(i)
3 голосов
/ 31 августа 2011

В дополнение к ответу @ coubeatczech вы также можете создавать экземпляры абстрактных классов (и признаков), если добавляете уточнение,

scala> :paste
// Entering paste mode (ctrl-D to finish)

abstract class Foo(val s: String) {
  def this(i: Int) = this("" + (i+2))
}

// Exiting paste mode, now interpreting.

defined class Foo

scala> val f = new Foo(23) {}
f: Foo = $anon$1@13d874e

scala> f.s
res3: String = 25

Хотя я показал пустое уточнение выше ("{}"), вы, как правило, предоставляете некоторые дополнительные определения, часто предоставляя реализации для абстрактных членов,

scala> abstract class Bar { def bar : Int }
defined trait Bar

scala> val b : Bar = new Bar { def bar = 23 }
b: Bar = $anon$1@1e17c6d

scala> b.bar
res1: Int = 23
...