Scala匹配子类与参数

时间:2016-12-14 00:36:51

标签: scala

我有一个父抽象类P

abstract class P {
  def isEmpty: Boolean
}

然后我有2个子类EmptyNonEmpty

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)
                                                 ^

怎么回事?

2 个答案:

答案 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定义为对象而不是类是有意义的。