2015-12-08 6 views
2

В настоящее время я придерживаюсь парадигмы «программа для интерфейса, а не реализации» в контексте особенностей scala и классов case , Рассмотрим следующий сценарий:Парадигма «Программирование к интерфейсу, а не реализация» в контексте особенностей scala и классов 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? 
    } 
} 

В основном мой вопрос: Как использовать тематические лакомства класса, такие как сопоставление с образцом, копировать и т.д. в приведенном выше примере?

Конечно, я мог бы просто отличить Foo до FooImpl, но это делает бесполезным подход всей программы к интерфейсу. Я пропустил здесь очевидное?

ответ

-1
def doSomething(foo: Foo) = foo match { 
    case FooImpl(x) => // whatever 
    case SomeOtherImplementor(x, y, z) => // whatever 
} 
+0

Спасибо за ваш ответ, но это не совсем то, что я искал. На самом деле мне не нужны ссылки на конкретные реализации внутри 'doSomething'. Все реализации 'Foo' должны быть взаимозаменяемыми без каких-либо изменений в' doSomething'. – Roman

+0

Затем положил его в 'Foo'? И если это не так, тогда вам нужно быть более конкретным. – MattPutnam