我有一个超类Command
,许多不同的子类从Command扩展,同时也可以扩展这些特征中的一个或多个ValuesCommand
,KeysCommand
,{{1}和其他许多人。
现在,我希望模式匹配同时扩展MembersCommand
和Command
的{{1}}的所有实现。
以下是我想要实现的伪代码:
ValuesCommand
我可以回退以匹配第一个特征并嵌套第二个KeysCommand
。但我真的不需要它,看起来很糟糕。
答案 0 :(得分:9)
你可以这样做:
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()
}
EDIT2:
对于您希望在cmd
上调用接受方式的情况,只有在ValuesCommand
或KeysCommand
时,您才能执行以下操作:
cmd match {
case _: ValuesCommand | _: KeysCommand => accept(cmd)
}
,我猜,它比干
更干cmd match {
case vc: ValuesCommand => accept(cmd)
case kc: KeysCommand => accept(cmd)
}