考虑抽象类Element
这里是许多子类的超类,如ArrayElement
,每个子类都有自己的辅助方法但具有共同的param
属性
我需要使用printValue
对象调用辅助方法that
。 check
方法在运行时接收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
}
答案 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
方法作为默认方法。