私は現在、ケーキパターンを使用して、いくつかの最適化アルゴリズムを実装しています。私はしばしば名前衝突の問題にぶつかった。例えば:ケーキパターンと名前の衝突を避ける
ここtrait Add[T] { this: Foo[T] =>
def constant: T
def plus(t1: T, t2: T): T
def add(t: T) = plus(t, constant)
}
trait Mul[T] { this: Bar[T] =>
def constant: T
def times(t1: T, t2: T): T
def mul(t: T) = times(t, constant)
}
trait Operations[T] { this: Add[T] with Mul[T] =>
def neg(t: T): T
}
、constant
は両方Add
とMul
特性で定義されているが、その値は異なる可能性があります。私はその形質の名前に接頭辞を付けることができましたが、私はそれが醜くて脆い(def mulConstant: T
)ことがわかります。それを行う良い方法はありますか?
あなたの答えをありがとう、それは私の問題を確かに解決します。あなたのPSに関しては、抽象タイプ 'T'を各特性に定義すると(名前は"コンポーネント "レベルで定義されるはずです)、名前型の衝突が発生します。私が間違っている ? – paradigmatic
この例では、 'T'はすべての特性において同じ「もの」を意味するので、衝突しません。たとえ各形質が異なるタイプの境界を持つTに寄与しても、それらは衝突しないであろう。それらのタイプ境界は、一緒に混合されると、異なる形質からむしろ一緒に集められる。彼らが縛っている限り、衝突しないで、物事は良いです(コンパイラ用)。 Daniel Spiewakがそのブログ記事で示していることの1つです。それにもかかわらず、私は個人的に2つの異なるコンポーネントで同じものを意味するわけではないので、「コンポーネント」レベルの抽象型に「T」よりもわかりやすい名前を付けます。 –
OK。しかし、ここで私は型が統一されていることを確認する必要があるので( 'T = Int'はどこでも)、全ての特性が同じ' T'を持つ依存関係を表現する必要があります。ジェネリック型以外の方法を実現する方法はありません。 – paradigmatic