如果一个变量是在一个类中定义的,则扩展一个特征,如何在特征中使用它?

时间:2014-12-10 14:01:31

标签: scala

我有以下代码,T1需要访问" a"这是Test的构造函数参数(扩展T1),但编译失败。如何解决?

trait T1 {
  def x=a.length
}
class Test(a:String) extends T1{

}

2 个答案:

答案 0 :(得分:7)

有几种可能性:

  1. 在您的特征中声明a为抽象成员:

    trait T1 { def a: String; def x = a.length } class Test(val a: String) extends T1

  2. 创建一个声明a的其他特征:

    trait HasA { def a: String } trait T1 extends HashA { def x = a.length; } class Test(val a: String) extends T1

  3. 要求T1只能由具有a

    的类使用

    trait HasA { def a: String } trait T1 { self: HasA => def x = a.length } class Test(val a: String) extends HasA with T1

答案 1 :(得分:3)

正如我之前在评论中所说,对我来说没有多大意义,无论如何,您可以使用自我类型引用特征并使用val访问变量:

trait T1 {
  self: Test => // self type reference.

  def x= a.length
}

class Test(val a: String) extends T1{ }

通过这种方式,T1只能从Test或继承自它的类扩展。