Scala 如何从混合方法访问类字段?

Scala 如何从混合方法访问类字段?,scala,mixins,traits,Scala,Mixins,Traits,我在Scala中使用mixin和traits,遇到了一个小问题,如何(不重写)从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"

我在Scala中使用mixin和traits,遇到了一个小问题,如何(不重写)从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"
我该怎么写,这样它就不会说“得到帮助”,而是说“Felix得到帮助”? 也就是说,从
name
字段中获取值,而不必在类定义中扩展
Friend
?(我不希望所有的
Cat
实例也成为
朋友

动态:

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"
  }
}
在飞行中:

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"
  }
}
在飞行中:

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"
  }
}
在飞行中:

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"
  }
}