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

ssc*_*zio 3 scala traits pattern-matching

我有一个超类Command,许多不同的子类的命令,并在同一时间延长也可以扩展这些性状的一种或多种ValuesCommand,KeysCommand,MembersCommand和其他许多人.

现在我想模式匹配Command扩展a ValuesCommand和KeysCommand同时的所有实现.

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

def apply(cmd : Command) = {
  cmd match {
    case c:(ValuesCommand && KeysCommand) => c.doSomething()
  }
}
Run Code Online (Sandbox Code Playgroud)

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

Kig*_*gyo 9

你可以这样做:

def apply(cmd : Command) = {
  cmd match {
    case c: ValuesCommand with KeysCommand => c.doSomething()
  }
}
Run Code Online (Sandbox Code Playgroud)

当你有一个类(例如ValKey这里),它们都延伸ValuesCommand,KeysCommand你也有类似的东西

class ValKey extends ValuesCommand with KeysCommand`
Run Code Online (Sandbox Code Playgroud)

编辑(您的评论):

我无法想象你想要ValuesCommand or KeysCommand这种情况的场景.您可以阅读@Randall Schulz评论中的链接,了解如何获得OR.

让我们假设您有OR(v),如链接中所述.

case c: ValuesCommand v KeysCommand => //soo.. what is c?
Run Code Online (Sandbox Code Playgroud)

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

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

cmd match {
  case vc: ValuesCommand => vc.doSomething()
  case kc: KeysCommand   => kc.doSomehtingElse()
}
Run Code Online (Sandbox Code Playgroud)

EDIT2:

对于要在其上调用accept方法的场景cmd,仅当它是a ValuesCommand或者KeysCommand,您可以执行以下操作:

cmd match {
  case _: ValuesCommand | _: KeysCommand => accept(cmd)
}
Run Code Online (Sandbox Code Playgroud)

我猜,这比干的更干

cmd match {
  case vc: ValuesCommand => accept(cmd)
  case kc: KeysCommand   => accept(cmd)
}
Run Code Online (Sandbox Code Playgroud)