おそらく、スタイルとエレガンスに優れた Scala の専門家が、コンストラクターの「プッシュアウト」問題がある次のコードを構成するためのより良い方法を見つけ出すのを手伝ってくれるでしょう。
単純な基本クラスから始めます。
class Foo(val i: Int, val d: Double, val s: String) {
def add(f: Foo) = new Foo(i + f.i, d + f.d, s + f.s)
override def toString = "Foo(%d,%f,%s)".format(i,d,s)
}
複雑なアプリケーションで型チェックを行うために、状態を追加しないサブクラスが必要です。
class Bar(i: Int, d: Double, s: String) extends Foo(i,d,s) {
override def toString = "Bar(%d,%f,%s)".format(i,d,s)
}
現状では、2 つのバーを追加すると、Foo のみが返されます。
val x = new Bar(1,2.3,"x")
val y = new Bar(4,5.6,"y")
val xy = x.add(y)
REPL で次の応答を使用します。
x : Bar = Bar(1,2.300000,x)
y : Bar = Bar(4,5.600000,y)
xy : Foo = Foo(5,7.900000,xy)
以下のように、Foo の add メソッドをコピーして貼り付けることなく、2 つの Bar を追加して別の Bar (Foo ではなく) を形成するにはどうすればよいですか?
class Bar(i: Int, d: Double, s: String) extends Foo(i,d,s) {
// ugly copy-and-paste from Foo:
def add(b: Bar) = new Bar(i + b.i, d + b.d, s + b.s)
override def toString = "Bar(%d,%f,%s)".format(i,d,s)
}
私はそのようなバーをたくさん持っています (基本的にはすべて Foo のコピーですが、型チェックには非常に重要です)。カットアンドペーストのないソリューションは利益をもたらします。
ありがとう!