【发布时间】:2015-07-05 20:17:26
【问题描述】:
假设我有一个具有一组混合特征的类 A 和一个具有类 A 值的类 B。有没有办法让 B 类拥有一组需要 A 的混合特征依次具有某些特征(包括继承自多个其他此类特征的扩展 B 的特征)?
例子:
trait A
trait Ax extends A
trait Ay extends A
class B(val a: A) // Should be traits,
class Bx(ax: Ax) extends B(ax) // but traits can't
class By(ay: Ay) extends B(ay) // take parameters
class Bxy extends Bx with By // Can't mix in classes
有没有办法让 Bxy 既继承自 Bx 和 By 又需要具有 Ax 和 Ay 特征的 A 值?
编辑 -- 这是一个替代的(仍然不工作的)示例,可能更清楚一点:
class A
trait Ax extends A { def doAx: String = "Ax method" }
trait Ay extends A { def doAy: String = "Ay method" }
class B(val a: A)
trait Bx extends B {
require(a.isInstanceOf[Ax])
def doBx: String = a.doAx // Ax methods not actually accessible here
}
trait By extends B {
require(a.isInstanceOf[Ay])
def doBy: String = a.doAy // Nor Ay methods here
}
class Bxy(a: A with Ax with Ay) extends B(a) with Bx with By {
def doBxy: String = a.doAx + a.doAy
}
【问题讨论】:
-
你为什么需要它?
-
如果你想向 B 添加功能,需要它的 A 实例依次具有某些功能。
-
Bxy 仍然只接受一个参数,并且只保存一个 A 值。我不想在 A 的 Ax 和 Ay 版本之间进行选择,我想要一个同时具有这两个特征的 A。
-
Bx 和 By 不会向类添加值——只是对传递给 B 类构造函数的单个参数添加限制。 (我添加了一个替代示例来澄清这一点。)
标签: scala class constructor multiple-inheritance traits