【发布时间】:2012-06-19 21:52:04
【问题描述】:
例如,我有以下类层次结构:
abstract class A {
def a() {}
def aa()
}
class B extends A {
def aa() {}
def b()
}
class C extends A {
def aa() {}
def c()
}
然后我想创建一个类,它可以存储这些类实例的任意组合的集合。它将能够调用常用方法。并且由于类型参数化,如果在创建期间使用这些类进行参数化,它必须提供调用特定于类的方法的能力:
object Group {
def apply(as: Buffer[A]) = new Group[A](as)
def apply[T <: A](as: Buffer[T]) = new Group[T](as)
}
class Group[T <: A](as: Buffer[T]) {
def a() { as.map(_.a()) }
def aa() { as.map(_.aa()) }
}
所以Group 可以使用默认的、最通用的类型参数来创建,如下所示:
val groupA = Group(Buffer[A]())
groupA.a() //ok
groupA.aa() //ok
groupA.b() //error
groupA.c() //error
它可以在使用A 的后代之一显式参数化时创建:
val groupB = Group[B](Buffer[B]())
groupB.a() //ok
groupB.aa() //ok
groupB.b() //ok
groupB.c() //error
如果可能的话,我想在创建组时以某种方式删除不必要的 [B] 类型规范,因为它可以从传递的缓冲区类型中提取:
val groupB = Group(Buffer[B]())
实现此功能的正确方法是什么?可能吗?也许有更好的架构决策来实现这一点?
更新:这里的代码是伪代码,我就是不知道怎么写。
更新2:我猜想调用b()或c()等特定类型的方法应该通过映射来实现:
groupC.as.map(_.c())
这是只有可能的,如果类型参数化是正确的。这更接近我的想法,但具体可能的实现方式仍然是个谜(除了asInstanceOf 事物的一堆用法)..
【问题讨论】:
-
也许使用您的
Group[C]隐式转换为具有c()方法的东西,这仅在参数为C时适用? -
@ziggystar:也许吧,但你能举个例子吗?我不确定我能不能这样理解。
标签: scala