我有一个超类Command
,从Command扩展了许多不同的子类,同时也可能扩展了ValuesCommand
,KeysCommand
,MembersCommand
等许多特征中的一个或多个。
现在,我想模式匹配Command
的所有实现,这些实现同时扩展ValuesCommand
和KeysCommand
。
这是我要实现的一些伪代码:
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()
}
}
当您有一个既扩展了
ValKey
和ValuesCommand
的类(例如此处的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方法的情况,仅当它是ValuesCommand
或KeysCommand
时,您可以执行以下操作:cmd match {
case _: ValuesCommand | _: KeysCommand => accept(cmd)
}
我猜这比
cmd match {
case vc: ValuesCommand => accept(cmd)
case kc: KeysCommand => accept(cmd)
}