おそらく、スタイルと優雅さの良さを備えた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つのバーを得るのですか?
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の本質的コピーが、型チェックのために非常に重要な)を持って、カットアンドペーストを含まない溶液は、配当金を支払うことになります。
ありがとうございます!
私は型の安全性のための「パラメータラベルとして」アイデアを、好き。ありがとうございました! –