Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 限制可能实现特征的类型_Oop_Groovy_Traits - Fatal编程技术网

Oop 限制可能实现特征的类型

Oop 限制可能实现特征的类型,oop,groovy,traits,Oop,Groovy,Traits,有没有可能限制可以实现特征的类型?比如说,我有一个 interface Something { void foo() } 还有一个特点 trait SomethingAbility { void bar() { println "bar" } } 有没有一种方法可以让trait只能由Something类型的类来实现,例如 // OK class SomethingImpl implements Something, SomethingAbility { void

有没有可能限制可以实现特征的类型?比如说,我有一个

interface Something {
  void foo() 
}
还有一个特点

trait SomethingAbility {
  void bar()  {
    println "bar"
  }
}
有没有一种方法可以让trait只能由
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"
  }
}
一个选择是向trait添加一个抽象方法

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

  abstract void foo()
}

这意味着,除非类还提供了
foo()
方法,否则该特性不能由类实现,但这与类型为
Something
的类不同,我认为您需要的是@Selftype,请参见 基本上,它说明了使用此特性的类必须实现什么。所以

@SelfType(Something)
trait SomethingAbility {
   void bar()  {
     println "bar"
   }
}

您声明,任何使用此特性的类也必须实现接口。例如,这可以确保,如果静态编译trait并从接口调用某个方法,编译不会失败。当然,对于标准Groovy,这不是必需的,因为duck类型。

使
SomethingAbility
实现
SomethingAbility
?@cfrick否…..我想确保我可以从
SomethingAbility
调用
SomethingAbility
的方法,但是
SomethingAbility
本身不需要是
某个东西
,如果它像鸭子一样嘎嘎叫;P但它认为您的最后一个示例和最后一句话应该是关于抽象的
foo
,而不是
bar
?但是Groovy当然可以静态编译,这意味着您不能依赖duck类型。我已经纠正了你强调的错误——也许我要远离动态领域,但不是说某种能力只有在与某些能力混合时才起作用,就像说,某种能力需要履行某种契约本身,从而实施(这意味着延伸特征)一种有效的方法一样?在编写容易出错的抽象方法之前,我宁愿让接口来完成这项工作。