首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我们可以在运行时为scala类分配/更改特征吗?如何--有示例代码吗?Like策略模式(四人帮设计模式)

我们可以在运行时为scala类分配/更改特征吗?如何--有示例代码吗?Like策略模式(四人帮设计模式)
EN

Stack Overflow用户
提问于 2012-06-16 00:00:05
回答 2查看 846关注 0票数 2

为了解释我的问题:

类别:玩具

Trait1:像男性一样说话

Trait2:像女性一样说话

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-06-16 03:25:09

Scala确实不能做到这一点。Kevin Wright的自动代理插件可以做到这一点,你可以用任意一个特征实例化和对象,而不需要将该特征作为基类的一部分。

我个人认为,试图以这种方式完成任务是与Scala的本质背道而驰的:很难,而且容易卡住。最好是设计一个不需要这些东西的解决方案--事实上,Scala粒度更倾向于泛函,它关注的是所有东西都是不可变的,并通过计算将一个对象替换为一个新对象。

票数 2
EN

Stack Overflow用户

发布于 2012-06-16 00:31:17

代码语言:javascript
复制
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?"
  }
}

然后

代码语言:javascript
复制
barbie = ken.copy(speaks = Female)

不能更改对象在运行时扩展的trait,因为混合使用trait来创建类(在.class文件中)。一个给定的对象只有一个类,这是永远不能改变的。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11054299

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档