Scala защищенный конструктор и компоновщик в сопутствующем объекте - PullRequest
2 голосов
/ 09 мая 2011

У меня есть несколько классов с защищенным конструктором, и метод фабрики находится внутри объекта-компаньона абстрактного суперкласса.Начиная с Scala 2.9.0.RC4 это больше не компилируется.Я «исправил» проблему, сделав конструкторы пакет защищенными .Но я не хочу, чтобы другие классы даже внутри того же пакета могли вызывать конструкторы.

Так что же мне делать?

sealed abstract class A
object A {
  //the factory method, returning either a B or C
  def apply(): A
}
class B protected (...) extends A
class C protected (...) extends A

Ответы [ 3 ]

1 голос
/ 09 мая 2011

Поскольку вам нужны классы, доступные для сопоставления с образцом, я бы предложил создать для них новый подпакет и сделать конструктор закрытым для этого пакета.Теперь нужно изменить только операторы импорта в вашем клиентском коде.

sealed abstract class A {

}
package myPackage.subPackage {

object A {
  def apply(): A = new B
}

class B private[subPackage] () extends A {

}
}

package other {
  object Foo {
    def foo {
      myPackage.subPackage.A()
      //does not compile: new myPackage.subPackage.B
    }
  }
}
1 голос
/ 09 мая 2011

Вы можете сделать их закрытыми внутренними классами объекта.

object A {
  private class B extends A
  private class C extends A
}
0 голосов
/ 25 января 2013

Другой вариант - создать сопутствующие объекты для каждой реализации A и делегировать конструкцию фабричному методу в этом объекте:

sealed abstract class A
object A {
  //the factory method, returning either a B or C
  def apply(): A = {
    if (...) B()
    else C()
  }
}
object B {
  def apply() : B = new B()
}
class B private (...) extends A

object C {
  def apply() : C = new C()
}
class C private (...) extends A
...