我有以下類層次結構。皮條客我的庫模式應用於類層次結構
sealed abstract class A
case class B extends A
case class C extends A
現在,我想一個foo
方法添加到類A
,B
和C
。但我不想以任何方式改變課程。所以我應用皮條客我的圖案模式如下。
abstract class RichA(a: A) {
def foo
}
class RichB(b: B) extends RichA(b){
def foo = { println("B"); //do something with b}
}
class RichC(c: C) extends RichA(c) {
def foo = { println("C"); //do something with c}
}
/////////////
implicit def A2RichA(a: A) = {
a match {
case a: B => new RichB(a)
case a: C => new RichC(a)
}
}
implicit def B2RichB(b: B) = new RichB(b)
implicit def C2RichC(c: C) = new RichC(c)
/////////////
def test() = {
def printA(a: A) = {
a.foo
}
val obj = new C
printA(obj)
}
test() //This prints "C"
這是工作,但A2RichA
隱函數的實現看上去有點難看,我因爲它涉及到case語句爲每個A的子類都可以在這個更優雅的方式做?基本要求是,如果我在A
類型的對象上調用foo
,則應調用B
或C
中的適當方法foo
,具體取決於對象的動態類型。
你想同''foo''添加到您的課程,或者你需要爲每個''A,B,C''的不同的實現? – 2012-07-18 08:41:08