【问题标题】:How do I pass an inherited variable into a Auxiliary constructor from a trait如何将继承的变量从特征传递到辅助构造函数
【发布时间】:2021-08-15 14:29:05
【问题描述】:

我正在寻找值 bork 并将其传递给类到构造函数中的类中。

trait dog {
  lazy val bork = "bork"
}


class Animal(val firstName: String, dogCommand: DogCommand) extends dog{
  def this(firstName: String) {
    this(firstName, DogCommand(bork))
  }
  
  def getDogCommand(): Unit = {
    dogCommand.getCommand()
  }
}

case class DogCommand(command: String) {
  def getCommand() :Unit = {
      println(command)
  }
}

val myDog = new Animal("first")

myDog.getDogCommand()

我通常得到 - 错误:未找到:值 bork

【问题讨论】:

    标签: scala


    【解决方案1】:

    问题是borkdog 上的一个值,但没有dog 的实例可用于读取borkthis 是一个构造函数,因此它无法访问正在构造的值。

    这是一种保留大部分原始代码的解决方案:

    trait dog {
      def bork = dog.DefaultBork
    }
    
    object dog {
      val DefaultBork = "bork"
    }
    
    class Animal(val firstName: String, dogCommand: DogCommand) extends dog {
      def this(firstName: String) = this(firstName, DogCommand(dog.DefaultBork))
    
      ...
    }
    

    您可以考虑删除dogbork 的默认值,以便任何实现该特征的类都需要为bork 提供值。 (如果要保留默认值,可以一直使用DefaultBork

    【讨论】:

    • 如果答案是好的,你可以接受它,这样其他人就知道这个问题已经回答了
    【解决方案2】:

    对于一项,您的 this 构造函数不正确。我还重命名了Dog。至于您的lazy val,这对特征不起作用。在此处查看更多信息why scala don't allow define lazy val in trait?。即使您将其设为非惰性,该值也不会初始化,直到构造时 val 尚不可用。另一个问题也是逻辑,Animal 不是Dog,而是相反。这是另一种选择:https://scastie.scala-lang.org/WnhxzSn6QtOf5vo1epDDqQ希望对您有所帮助。 ;)

    trait Dog {
      lazy val bork = "bork"
    }
    
    
    class Animal(val firstName: String, dogCommand: DogCommand) extends Dog {
      def this(firstName: String) = this(firstName, DogCommand(bork))
      
      def getDogCommand(): Unit = {
        dogCommand.getCommand()
      }
    }
    
    case class DogCommand(command: String) {
      def getCommand() :Unit = {
          println(command)
      }
    }
    
    val myDog = new Animal("first")
    
    myDog.getDogCommand()
    

    【讨论】:

    • 最好发布您的解决方案,而不是仅仅复制问题中的代码。
    • @Tim 这是他们的代码,但已更正,尽管尚未解决
    • 所以它已“更正”但仍然显示问题中提到的错误。
    • 是的。根据我的第一句话:“对于一个项目,您的 this 构造函数不正确。我还重命名了 Dog。至于您的 lazy val 不适用于特征”;)
    • 另外,我的答案有一个 Scastie 链接,它可能有一种更好的方法,它确实有效,而且不那么隆重。不确定您是否看到 OP 代码可能违反了 OOP “is-a” 规则。我做了一个链接,因为我觉得它不是 OP 代码的直接寻址。
    猜你喜欢
    • 1970-01-01
    • 2021-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-13
    相关资源
    最近更新 更多