scala超类引用,子类对象不调用子类方法

时间:2018-03-14 11:53:30

标签: scala

考虑抽象类Element这里是许多子类的超类,如ArrayElement,每个子类都有自己的辅助方法但具有共同的param属性

我需要使用printValue对象调用辅助方法thatcheck方法在运行时接收ArrayElement个对象。因此,在运行时,我希望不会有任何问题。

但是,这段代码没有编译,that对象在编译时在abstact类printValue中查找Element方法。它迫使我在printValue

中声明Element

ArrayElement中的所有辅助方法都需要在超抽象类Element中声明?

object ObjectTest {
    def main(args: Array[String]): Unit = {
        val x = new ArrayElement(999).check(new ArrayElement(333))
    }
}
abstract class Element {
    val param : Int
    def printValue : String  // commenting this line throws error below
}
class ArrayElement(override val param : Int) extends Element {
    def check(that: Element)  = {
       this.printValue
       println(that.param)
       println(that.printValue)  // throws error -- **value printValue is not a member of org.mytest.challenges.Element**
    }
    def printValue = "value:" + param
}

2 个答案:

答案 0 :(得分:0)

该对象被输入为Element,然后如果从Element中删除printValue则不会编译。此外,x也不是Element的成员。如果check方法将由Element的不同子类使用,您可以考虑将其作为受保护的方法移动到Element,它可以从ArrayElement访问,因为它是扩展的。

object ObjectTest {
  def main(args: Array[String]): Unit = {
    val x = new ArrayElement(999).check(new ArrayElement(333))
  }
}

abstract class Element {
  val param : Int
  def printValue : String

  protected def check(that: Element)  = {
    this.printValue
    println(that.param)
    println(that.printValue)
  }
}

class ArrayElement(override val param : Int) extends Element {
  def printValue = "value:" + param
}

另一方面,如果check将只是一个ArrayElement方法,则应该将其重新键入为ArrayElement

答案 1 :(得分:0)

ArrayElement中的所有辅助方法都需要在超抽象类Element中声明?

是的,如果def check方法的参数属于超类类型,则必须使用它们。

或者

您可以将传入对象转换为目标类型并调用所需的方法。

object ObjectTest {
  def main(args: Array[String]): Unit = {
     val x = new ArrayElement(999).check(new ArrayElement(333))
  }
}

abstract class Element {
    val param : Int
    // def printValue : String  // commenting this line throws error below
}
class ArrayElement(override val param : Int) extends Element {
   def check(that: Element)  = {
       this.printValue
       println(that.param)
       println(that.asInstanceOf[ArrayElement].printValue)
  }
  def printValue = "value:" + param
}

或者

在父类中使用def printValue方法作为默认方法。