如何在scala中访问子类实例中的超类字段? [重复]

问题描述 投票:0回答:1

这个问题在这里已有答案:

我创建了一个抽象类(Animal),其中包含一些具有具体实现的字段和方法。我创建了两个子类(Dog和Cat),扩展了抽象类并覆盖了超类的字段。当我尝试访问字段时超类我收到编译错误,我无法获取超类字段的值。

我尝试在Cat类的子类实例中使用super关键字来获取Animal超类的年龄,但它没有成功。

def superPrnt{println(super.age)}
compilation error:
/home/jdoodle.scala:32: error: super may not be used on variable age
   def superPrnt{println(super.age)}
                           ^
one error found
Command exited with non-zero status 1

我在这里做错了什么,如果那么在scala中的子类实例中访问超类字段值的正确方法是什么?

object MyClass {

  def main(args: Array[String]) {
      val dog=new Dog("s")
      dog.sayHello
      println(dog)
      val cat =new Cat("nancy")
      cat.sayHello
      println(cat)
      cat.superPrnt
     //cat.age=12
     //cat.greeting="nhj"
     //println(cat)
  }
  abstract class Animal() {

      val greeting:String="boo"
      var age:Int=5
      def sayHello{println(greeting)}
      override def toString=s"I say $greeting and i am $age years old"

  }
  class Dog(name:String) extends Animal {
      override val greeting="woof"
      age=2
  }
  class Cat(name:String) extends Animal{
      override val greeting="meow"
      age=4
      def superPrnt{println(super.age)}
  }
}
scala oop inheritance super superclass
1个回答
1
投票

尝试使var成为def并用覆盖替换重新分配。

abstract class Animal() { 
  val greeting:String="boo"
  def age:Int=5
  def sayHello{println(greeting)}
  override def toString=s"I say $greeting and i am $age years old"
}

class Dog(name:String) extends Animal {
  override val greeting="woof"
  override def age=2
}

class Cat(name:String) extends Animal{
  override val greeting="meow"
  override def age=4
  def superPrnt{println(super.age)}
}
© www.soinside.com 2019 - 2024. All rights reserved.