1

我有以下特点:

sealed trait CommandLike[T, Repr <: CommandLike[T,_]]  extends CanBeEnabled[Repr]{
  def name: String
  def execute: T => Any
}

trait CanBeEnabled[Repr] {
  def enabled: Boolean
  def isEnabled = enabled
  def isDisabled = enabled
  def disable : Repr = setEnabled(enabled = false)
  def enable : Repr = setEnabled(enabled = true)
  def setEnabled(enabled: Boolean) : Repr
}

现在我想要一个命令列表:

val cmds = List[CommandLike[Unit, _]]()

这很烦人,所以我宁愿隐藏Repr 类型参数:

val cmds = List[Command[Unit]]()

所以我需要隐藏Repr的Command trait:

trait Command[T] extends CommandLike[T, _ <: Command[T]]

但这给了我:

非法循环引用涉及 trait Command trait Command[T] extends CommandLike[T, _ <: Command[T]]

有任何想法吗?^

4

2 回答 2

1
trait CanBeEnabled {
  def enabled: Boolean
  def isEnabled = enabled
  def isDisabled = ! enabled
  def disable : this.type = setEnabled(enabled = false)
  def enable : this.type = setEnabled(enabled = true)
  def setEnabled(enabled: Boolean) : this.type
}

sealed trait Command[T]  extends CanBeEnabled {
  def name: String
  def execute: T => Any
}

isDisabled 应该是!启用...

于 2013-07-29T16:49:04.277 回答
0

对于你trait Command的实现CommandLikeReprCommand[T],所以你应该有:

Command[T] extend CommandLike[T, Command[T]]

与集合库定义的方式相同,例如,

Seq[T] extends ... with SeqLike[T, Seq[T]]

@Reuben 的答案也适用,具有不同的语义:

如果稍后,您定义另一个命令:

class CustomCommand[T] extends Command[T]
  • 在这种this.type情况下(单例类型),setEnabled将返回 a CustomCommand[T]
  • Repr我上面描述的情况下,setEnabled将返回 a Command[T],因为这就是Repr定义的方式。

两者都很好,这完全取决于您的实际需求。对于这样的实用方法,this.type似乎更好。

于 2013-07-29T16:59:21.487 回答