假设我有一个特质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