【问题标题】:How do I access a class field from a mixed in method?如何从混合方法访问类字段?
【发布时间】:2014-03-23 16:41:19
【问题描述】:

我在 Scala 中使用 mixin 和 trait,我遇到了一个小问题,我如何(不覆盖)从 mixin 访问类字段?

这是我的代码:

trait Friend {
  def getHelp() = "Gets help"
}

trait Speak {
  def speak(): String
}

class Person(var name: String) extends Speak with Friend {
  override def speak() = s"Hello, I am $name"
}

class Dog(var name: String) extends Speak with Friend {
  override def speak() = "woof woof!"
}

class Cat(var name: String) extends Speak {
  override def speak() = "meow!"
}

真的没什么特别的,但现在我将Friend 混合到Cat 的对象中

val felix = new Cat("Felix") with Friend

println(felix.getHelp) // prints "Gets help"

我该如何写,而不是说“得到帮助”,而是说“菲利克斯得到帮助”? 也就是说,从name 字段中获取值而不必在类定义处扩展Friend? (我不希望Cat 的所有实例也成为Friend

【问题讨论】:

    标签: scala mixins traits


    【解决方案1】:

    在飞行中:

    val fred = new Cat("Fred") with Friend {
      override def getHelp() = {
        name + " " + super.getHelp()
      }
    }
    
    println(fred.getHelp())
    

    或使用其他特征:

    trait FriendWithName extends Friend {
      var name: String
    
      override def getHelp() = {
        name + " " + super.getHelp()
      }
    }
    
    val barney = new Cat("Barney") with FriendWithName
    println(barney.getHelp())
    

    或者完全没有trait Friend

    val wilma = new Cat("Wilma") {
      def getHelp() = {
        name + " gets help"
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-13
      • 1970-01-01
      • 2021-07-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多