私の質問を説明するには:
クラス:おもちゃ
特性1:男性のように話す
特性2:女性のように話す
実行時におもちゃの動作(特性)を変更して、同じオブジェクトが男性のように話すこともあれば、同じオブジェクトが女性のように話すこともありますか?
実行時に話す動作を変更したい。
私の質問を説明するには:
クラス:おもちゃ
特性1:男性のように話す
特性2:女性のように話す
実行時におもちゃの動作(特性)を変更して、同じオブジェクトが男性のように話すこともあれば、同じオブジェクトが女性のように話すこともありますか?
実行時に話す動作を変更したい。
sealed trait Speaker
case object Male extends Speaker
case object Female extends Speaker
class Toy(name: String, speaks: Speaker = Male) {
def speak = speaks match {
case Male => "ugh"
case Female => "What time do you call this?"
}
}
それで
barbie = ken.copy(speaks = Female)
trait
実行時にオブジェクトが拡張する s を変更することはできませんtrait
。クラスを作成するために a が (.class ファイル内で) 混合されるためです。特定のオブジェクトには 1 つのクラスしかなく、これを変更することはできません。
Scala は実際にはそうしません。それを行うことができる Kevin Wright の autoproxy プラグインがあり、その特性が基本クラスの一部でなくても、いずれかの特性でインスタンス化してオブジェクト化できます。
個人的には、そのように物事を達成しようとすることは、Scala の考え方に反することだと思います。つまり、困難で行き詰まりやすいということです。そのようなことを必要としないソリューションを設計することをお勧めします。実際、Scala グレインは、すべてが不変であり、計算の結果として 1 つのオブジェクトを新しいオブジェクトに置き換えることに焦点を当てた機能的な傾向があります。