如何模式匹配扩展多个特征的对象?

时间:2014-05-05 18:24:31

标签: scala pattern-matching traits

我有一个超类Command,许多不同的子类从Command扩展,同时也可以扩展这些特征中的一个或多个ValuesCommandKeysCommand,{{1}和其他许多人。

现在,我希望模式匹配同时扩展MembersCommandCommand的{​​{1}}的所有实现。

以下是我想要实现的伪代码

ValuesCommand

我可以回退以匹配第一个特征并嵌套第二个KeysCommand。但我真的不需要它,看起来很糟糕。

1 个答案:

答案 0 :(得分:9)

你可以这样做:

def apply(cmd : Command) = {
  cmd match {
    case c: ValuesCommand with KeysCommand => c.doSomething()
  }
}

当您有一个类ValKey此处)同时扩展ValuesCommandKeysCommand时,您还会有类似

的内容
class ValKey extends ValuesCommand with KeysCommand`

编辑(您的评论):

我无法想象在这种情况下你想要ValuesCommand or KeysCommand之类的东西。您可以阅读@Randall Schulz评论中的链接,了解如何获得OR。

让我们想象你有你的OR(v),就像在链接中所描述的那样。

case c: ValuesCommand v KeysCommand => //soo.. what is c?

现在你仍需要在c上进行模式匹配,以找出它是什么类型的命令。 (最有可能)

所以最后你仍然可以直接这样做:

cmd match {
  case vc: ValuesCommand => vc.doSomething()
  case kc: KeysCommand   => kc.doSomehtingElse()
}

EDIT2:

对于您希望在cmd上调用接受方式的情况,只有在ValuesCommandKeysCommand时,您才能执行以下操作:

cmd match {
  case _: ValuesCommand | _: KeysCommand => accept(cmd)
}

,我猜,它比干

更干
cmd match {
  case vc: ValuesCommand => accept(cmd)
  case kc: KeysCommand   => accept(cmd)
}