&引用;程序到接口,而不是实现”;scala特征和案例类背景下的范式

&引用;程序到接口,而不是实现”;scala特征和案例类背景下的范式,scala,traits,case-class,Scala,Traits,Case Class,在scala traits和case类的上下文中,我目前一直坚持“程序到接口,而不是实现”的范式。考虑下面的场景: trait Foo { def bar: String } case class FooImpl(override val bar: String) extends Foo object Hello { def main(args: Array[String]) { val foo = new FooImpl("bar") doSomething(foo

在scala traits和case类的上下文中,我目前一直坚持“程序到接口,而不是实现”的范式。考虑下面的场景:

trait Foo {
  def bar: String
}

case class FooImpl(override val bar: String) extends Foo

object Hello {
  def main(args: Array[String]) {
    val foo = new FooImpl("bar")
    doSomething(foo);
  }

  def doSomething(foo: Foo) = {
     // how to use case class goodies of FooImpl here?
  }
}
基本上,我的问题是:如何在上面的示例中使用case类的好东西,如模式匹配、复制等?


当然,我可以将
Foo
转换为
FooImpl
,但这使得整个“程序到接口”方法毫无用处。我是否错过了这里显而易见的内容?

谢谢你的回答,但这并不是我想要的。实际上,我不想在
doSomething
中引用任何具体的实现。
Foo
的所有实现都应该是可互换的,而不对
doSomething
进行任何更改。然后将其放入
Foo
?如果不是这样,那么你需要更具体一些。谢谢你的回答,但这不是我想要的。实际上,我不想在
doSomething
中引用任何具体的实现。
Foo
的所有实现都应该是可互换的,而不对
doSomething
进行任何更改。然后将其放入
Foo
?如果不是这样,那么你需要更具体一些。
def doSomething(foo: Foo) = foo match {
    case FooImpl(x) => // whatever
    case SomeOtherImplementor(x, y, z) => // whatever
}