限制可能实现Trait的类型

Dón*_*nal 6 oop groovy traits

是否可以限制可以实现特征的类型?比方说,例如我有一个类型

interface Something {
  void foo() 
}
Run Code Online (Sandbox Code Playgroud)

和一个特点

trait SomethingAbility {
  void bar()  {
    println "bar"
  }
}
Run Code Online (Sandbox Code Playgroud)

有没有办法让我只能允许特性由类型的类实现Something,例如

// OK
class SomethingImpl implements Something, SomethingAbility {
  void foo() {
    println "foo"
  }
}

// error: this class should not be allowed to implement the trait
// because it's not a Something
class NotSomething implements SomethingAbility {
  void foo() {
    println "foo"
  }
}
Run Code Online (Sandbox Code Playgroud)

一种选择是向特征添加抽象方法

trait SomethingAbility {
  void bar() {
    println "bar"
  }

  abstract void foo()
}
Run Code Online (Sandbox Code Playgroud)

这意味着特性不能由类实现,除非该类也提供了一个foo()方法,但这与类的类不同Something

bla*_*rag 9

我认为您正在寻找的是@Selftype,请参阅http://docs.groovy-lang.org/docs/latest/html/gapi/groovy/transform/SelfType.html 基本上它说明了使用此特征的类具有什么实行.所以

@SelfType(Something)
trait SomethingAbility {
   void bar()  {
     println "bar"
   }
}
Run Code Online (Sandbox Code Playgroud)

你声明,任何使用这个特性的类也必须实现Something接口.这样可以确保,例如,如果您静态编译特征并从接口Something调用方法,则该编译不会失败.当然,对于标准的Groovy,这不是必需的,因为鸭子打字.