私は Scala の初心者なので、これがばかげた質問であれば許してください。
追加のメソッドを含む拡張 Map タイプを作成したいとします。これを行う方法はいくつかあります。1つ目は構成です:
class Path[V](val m: Map[V, Int]) {
// Define my methods
}
もう1つは継承によるものです。
class Path[V] extends Map[V, Int] {
// Define my methods
}
最後に、「特性」ルートも検討しました。
trait Path[V] extends Map[V, Int] {
// Define my methods
}
内部のものを常に参照する必要があるため、構成は少し厄介です。継承はかなり自然ですが、私にはしわがあります (詳細は後ほど)。Traits はこれを行うための非常にエレガントな方法のように思えます。「with」構造を使用するのは非常に便利ですが、私にとっては問題もあります。
私が遭遇しているしわは、++のようなメソッドにあります。彼らは新しい地図を返します。したがって、上記の「私の方法」がマップに何かを追加したいとしましょう(単なる例です。マップには既にこれがあることがわかっています)。
trait Path[V] extends Map[V,Int] {
def addOne(v: V, i: Int): Path[V] = this + (v -> i)
}
戻り値の型が Path[V] ではないため、これはエラーを生成します。これで、新しいインスタンスで "with" を使用して Path[V] トレイトを追加できることがわかりました。しかし、ここで新しいマップの構築を制御することはできません。Path[V] トレイトを追加する方法はありますか? 事前入力された新しい不変マップを作成し、「with Path[V]」でタグ付けすることを考えましたが、事前入力されたマップを作成するために使用できるコンストラクターはありません。
継承を使用して同様の問題が発生するのではないかと思います (確認はしていませんが)。マップに新しいエントリを追加する新しいメソッドを追加することはできますが、必要な "Path[V]" を取得できません。合成アプローチは、ここに行く唯一の方法のようです。
これが明確であることを願っています。コメント?