我有一个超类Command,从Command扩展了许多不同的子类,同时也可能扩展了ValuesCommandKeysCommandMembersCommand等许多特征中的一个或多个。

现在,我想模式匹配Command的所有实现,这些实现同时扩展ValuesCommandKeysCommand

这是我要实现的一些伪代码:

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

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

最佳答案

您可以这样做:

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

当您有一个既扩展了ValKeyValuesCommand的类(例如此处的KeysCommand)时,您也会遇到类似
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()
}

编辑2:

对于要在cmd上调用accept方法的情况,仅当它是ValuesCommandKeysCommand时,您可以执行以下操作:
cmd match {
  case _: ValuesCommand | _: KeysCommand => accept(cmd)
}

我猜这比
cmd match {
  case vc: ValuesCommand => accept(cmd)
  case kc: KeysCommand   => accept(cmd)
}

09-25 22:22