私は、単純なCRUDシステムに使用される基本特性を定義しようとしています。しかし、私は "copyWithId" defをサポートするために基本的な特性が必要です(Scalaのケースクラスの魔法は利用できないので)。私がこれまでに発見した最善のアプローチは、次のとおりです。具体的なサブタイプインスタンスを返すスカラ形質defの定義
trait Identifiable[ID, T] {
def id: Option[ID]
def copyWithId(id: Option[ID]): T
}
case class TestNamedIdentity(id: Option[Int], name: String)
extends Identifiable[Int, TestNamedIdentity] {
def copyWithId(id: Option[Int]): TestNamedIdentity = {
copy(id = id)
}
}
これは動作しますが、それはIDと自己を拡張するために、すべての具体的なインスタンスを必要とするので、少し不格好に見えます。
trait Identifiable[ID] {
this:X =>
def copyWithId(id: Option[ID]): X
def id: Option[ID]
}
具体的なクラスに対する自己参照の形式を使用しています。この作品を作る方法は?
更新:
以下のユースケースではアイデアが@jwvhからソリューションを使用して
abstract class SomeClass[A <: IdentifiableEntity[ID], ID] {
def someFunc2: Option[ID]
def someFunc(item: A): A = {
item.copyWithId(someFunc2)
}
}
のようなコードでそれを使用することですが、コールの後に「asInstanceOf」キャストが必要です。どちらが私のユースケースのために働いていますが、より洗練されたソリューションを望んでいました。
item.copyWithId(someFunc2).asInstanceOf[A]
'T 'を返す' Identifiable'を含むパラメトリックメソッドを書く必要があるときに、私がうまく動作するのは私が知っている唯一のフォームです。コピーメソッドを書き直すのは厄介なようですが、私はCRUDメソッドと同じことをやっていましたが、私はそれを処理しました。それを超えて、私が考えている定型文を保存することができるのは、マクロにすぎませんが、そんなに節約できません。抽象的な方法で 'copy'を使って作業するのは非常に難しいです。 –
@MichaelZajac私はマクロが唯一の実行可能な解決策であることを恐れていました。私はそのレベルの混乱をコードベースに追加するつもりはありません。私はjwvhのアプローチは、上記の私の最初のフォームよりもapiの消費者のための少なくとも清潔であると思う。 – rapidninja