关于子类实例处理



假设我有一个特质A和一个扩展A的类A1

trait A
class A1 extends A

A1有一些独特的属性:

class A1 extends A { val hello = "hello" }

我有一个方法,我想处理特质A的所有子类:

def handle:A = new A1

但是,如果我尝试访问 A1 中定义的唯一属性,可以理解的是,它不起作用:

scala> handle.hello
<console>:11: error: value hello is not a member of A
              handle.hello
                     ^

一旦我完成了A处理完A子类的实例,我如何再次访问它们的所有唯一属性?这个机制是如何工作的?

有各种复杂程度不同的机制可用于处理此问题,但可能最简单和最常见的是模式匹配:

val a = get
...do stuff with a as an `A`...
a match {
  case a1: A1 => a1.hello
  ...other case clauses for other subtypes of A, if required...
  case _ => println("Not a known sub-type of A")
}

另一种机制涉及ClassTag s和/或TypeTag s(或Manifest s,在Scala 2.10之前),我不太熟悉。

一种可能的机制是将其他接口定义为特征。例如:

scala> class A
defined class A
scala> trait A1 { val hello = "hello" }
defined trait A1
scala> def handle:A with A1 = new A() with A1
handle: A with A1
scala> handle.hello
res0: String = hello

相关内容

  • 没有找到相关文章

最新更新