2

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)

(ソースコードを共有できないため、これは偽のクラス名を使用した単なるサンプルです)

特性を定義する場合、クラス コンストラクターで値を公開してオーバーライドせずに値をスーパークラスに渡す方法を知りません。

Dotty (Scala 3) では trait パラメーターが許可されていますが、Scala 2.13 では許可されていません。

解決策を知っている場合は、説明付きのスニペットを提供してください! ありがとう!

4

2 に答える 2

2

まず、 を制御できる場合は、この問題を完全に回避するために を作成するJmsServiceInitialiser可能性を調査します。qConfigdef

定義を現状のまま維持したいが、比較的クリーンな状態を維持したい場合は、初期イニシャライザを実行するためのラッパーを作成するだけです。

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ます 。bc=a+b

于 2019-10-03T13:30:01.137 に答える