2

解释我的问题:

类别:玩具

特质1:说话像男性

特质2:像女性一样说话

我可以在运行时更改玩具的行为(特征),所以有时同一个对象说话像男性,有时同一个对象说话像女性?

我想在运行时改变说话的行为。

4

2 回答 2

4
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 文件中)。给定的对象只有一个类,并且永远不能更改。

于 2012-06-15T16:31:16.967 回答
2

Scala 真的不这样做。有 Kevin Wright 的 autoproxy 插件可以做到这一点,您可以使用任一 trait实例化和对象,而该 trait 不是基类的一部分。

我个人认为,试图以这种方式完成事情违背了 Scala 的特点:困难且容易陷入困境。最好设计一个不需要这些东西的解决方案——事实上,Scala 粒度更倾向于函数式,它把重点放在所有不可变的东西上,并通过计算将一个对象替换为一个新对象。

于 2012-06-15T19:25:09.460 回答