Scala抽象类,自己做什么?

时间:2017-01-25 18:08:34

标签: scala class

我正在学习抽象类,这个链接非常有用。

scala generic method overriding

abstract class Foo[T] { self:T =>
   def bar1(f:T):Boolean
   def bar2(f:T):T
}

class FooImpl extends Foo[FooImpl]{
   override def bar1(f:FooImpl) = true
   override def bar2(f:FooImpl) = f
}

self:T代表什么?T是我理解的类参数。

1 个答案:

答案 0 :(得分:3)

正如@cchantep在评论中提到的,self : T在这种情况下是自我类型注释,基本上说Foo[T]的实例也需要表现为{{ 1}}。您可以在T中看到FooImpl确实如此。

您可以找到有关自我类型注释hereherehere的更多信息。请注意,在大多数情况下,您将看到它在依赖注入和蛋糕模式的上下文中使用。

the second link最感兴趣的是我认为最初的部分:

  

换句话说,这样做有什么意义:

     

FooImpl <: Foo
  trait A

     

当你可以这样做时:

     

trait B { this: A => }
  trait A

     

为什么要使用[这种语法]?

     

[...]答案通常归结为“B要求A”(注释)与“B为A”(继承),前者更适合依赖管理。

最后,只是为了澄清,请注意trait B extends A这个词根本不是必需的。这可以是任何有效的变量名称,但selfself大部分时间都是约定。也就是说,你可能会这样做:

this

但那不太常见。