我有以下类层次结构。
sealed abstract class A
case class B extends A
case class C extends A
现在,我想向foo
classes 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
隐式函数的实现对我来说有点难看,因为它涉及 A 的每个子类的 case 语句。这可以用更优雅的方式完成吗?基本要求是,如果我调用foo
type 的对象A
,它应该调用适当的方法foo
,B
或者C
取决于对象的动态类型。