解释我的问题:
类别:玩具
特质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 文件中)。给定的对象只有一个类,并且永远不能更改。
Scala 真的不这样做。有 Kevin Wright 的 autoproxy 插件可以做到这一点,您可以使用任一 trait实例化和对象,而该 trait 不是基类的一部分。
我个人认为,试图以这种方式完成事情违背了 Scala 的特点:困难且容易陷入困境。最好设计一个不需要这些东西的解决方案——事实上,Scala 粒度更倾向于函数式,它把重点放在所有不可变的东西上,并通过计算将一个对象替换为一个新对象。