Как создать параметр для конструктора суперкласса без раннего инициализатора в Scala - PullRequest
1 голос
/ 03 октября 2019

Поскольку ранние инициализаторы Scala 2.13 устарели.

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

Пример того, что я сделал до сегодняшнего дня:

abstract class JmsServiceInitialiser(val qConfig: Config)

class ActiveMQService(
  val configA: ConfigElement,
  val configB: ConfigElement
) extends {
  val config: Config = {
    println(configA)
    println(configB)
    ...
    configA + configB
  }
} with JmsServiceInitialiser(config)

(Это просто пример с поддельными именами классов, поскольку я не могу поделиться своим исходным кодом)

Если я определяю черту, я не знаю, как передать значение суперклассу, не подвергая его и не переопределяя его в конструкторе класса.

Я видел, что Дотти (Scala 3) допускает параметры черты, ноScala 2.13 этого не делает.

Пожалуйста, предоставьте фрагмент с объяснением, если вы знаете решение! Спасибо!

Ответы [ 2 ]

2 голосов
/ 03 октября 2019

Во-первых, если у вас есть контроль над JmsServiceInitialiser, я бы исследовал возможность сделать qConfig a def, чтобы вообще избежать этой проблемы.

Если вы абсолютно хотите сохранить определения в том виде, в каком они естьони сохраняются и остаются относительно чистыми, вы можете просто создать оболочку для запуска вашего раннего инициализатора.

class Config
class ConfigElement {
  def +(e: ConfigElement): Config = ???
}

abstract class JmsServiceInitialiser(val config: Config)

class Early(val a: ConfigElement, val b: ConfigElement) {
  val c: Config = a + b 
}

class ActiveMQService(early: Early) extends JmsServiceInitialiser(early.c) {
  val a = early.a
  val b = early.b
}

Если вы не хотите объявлять класс Early, вы также можете просто передатьспособ определить c из a и b таким образом:

class ActiveMQService(val a: ConfigElement, val b: ConfigElement, f: (ConfigElement, ConfigElement) => Config) 
  extends JmsServiceInitialiser(f(a,b))

Оба эти решения немного уродливы, и я бы посоветовал подумать о том, действительно ли вам нужен a, b и c=a+b как ученики.

0 голосов
/ 03 октября 2019

Я обнаружил, что это работает, просто вычисляя переменную при передаче ее суперклассу:

abstract class JmsServiceInitialiser(val qConfig: Config)

class ActiveMQService(
  val configA: ConfigElement,
  val configB: ConfigElement
) extends JmsServiceInitialiser({
  println(configA)
  println(configB)
  ...
  configA + configB
})

Пожалуйста, опубликуйте свой ответ, если вы нашли лучшее решение.

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