多种自我类型可能吗?

时间:2010-12-04 18:24:22

标签: scala

我想要执行以下操作,但自行类型行无法编译。我有这种语法错误或者这只是不可能吗?

trait A {
  def aValue = 1
}
trait B {
  def bValue = 1
}
trait C {
  a : A, b : B =>
  def total = a.aValue + b.bValue
}

class T extends C with A with B { ...

2 个答案:

答案 0 :(得分:74)

您可以拥有一个复合类型的自我类型。

试试这个:

trait A {
  def aValue = 1
}
trait B {
  def bValue = 1
}
trait C {
  self: A with B =>
  def total = aValue + bValue
}

class ABC extends A with B with C

答案 1 :(得分:3)

使用一个特征,您可以使用结构类型执行此操作:

trait C {
  self: { def aValue: Int
          def bValue: Int } =>

  def total = aValue + bValue
}

class ABC extends C {
  def aValue = 1
  def bValue = 1
}

使用了反思。

但是,首先你不应该因principle of least power而过度使用自我类型。

可以通过扩展其他文章来添加来自问题的方法:

trait C extends A with B{
  def total = aValue + bValue
}

或明确键入两种方法:

trait C {
  def aValue: Int
  def bValue: Int

  def total = aValue + bValue
}

在哪里使用自我类型?

自我类型通常与课程一起使用。这是trait要求成为所需类的子类的好方法。

还有一个很好的使用带有triats的自我类型:当你想用多重继承操纵类初始化的顺序时。