【问题标题】:Cyclic reference when trying to hide Repr尝试隐藏Repr时的循环引用
【发布时间】:2013-07-30 01:05:24
【问题描述】:

我有以下特点:

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] 的非法循环引用 扩展 CommandLike[T, _ <: command>

有什么想法吗? ^

【问题讨论】:

    标签: scala types circular-dependency


    【解决方案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 应该是!启用...

    【讨论】:

    • Reuben,你能给我们一个实际编译的 Command 的具体实例的例子吗,即 class X extends Command[Unit]{...}。我也应该能够做到: var x = new X; x = x.禁用。请在发布之前检查它是否可以编译。
    【解决方案2】:

    对你来说,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 将返回CustomCommand[T]
    • 在我上面描述的Repr 的情况下,setEnabled 将返回一个Command[T],因为这就是Repr 的定义方式。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-27
      • 1970-01-01
      • 2019-05-07
      • 2020-06-09
      • 2021-01-07
      • 2020-08-03
      相关资源
      最近更新 更多