我有一个父抽象类P
:
abstract class P {
def isEmpty: Boolean
}
然后我有2个子类Empty
和NonEmpty
:
class Empty extends P {
def isEmpty: Boolean = true
}
在NonEmpty
中,我需要定义一个函数union
,如下所示:
class NonEmpty(name: String) extends P {
def isEmpty: Boolean = false
def union(that: P): Unit = {
that match {
case e: Empty => print("empty")
case n: NonEmpty => print("NonEmpty:" + n.name)
}
}
}
但是,我收到了一个错误:
14: error: value name is not a member of NonEmpty
case n: NonEmpty => println("NonEmpty:" + n.name)
^
怎么回事?
答案 0 :(得分:4)
只需使name
成为该类的公共(即可见)值成员。
class NonEmpty(val name: String) extends P { ...
或者你可以把它变成case class
。这样,参数就会自动公开,并且模式匹配得更清晰简洁。
case NonEmpty(n) => print("NonEmpty:" + n)
答案 1 :(得分:2)
name
是类的构造函数的参数,但该字段尚未为NonEmpty
类的对象赋值。
替换
class NonEmpty(name: String) extends P
与
class NonEmpty(val name: String) extends P
这样做可以定义一个字段并指定构造函数中传递的值。
您似乎正在使用这些类来为数据结构建模树。在这种情况下,将Empty
定义为对象而不是类是有意义的。