0

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

trait A
class A1 extends A

A1具有一些独特的属性:

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

我有一个方法,我想处理 trait 的所有子类A

def handle:A = new A1

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

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

处理完AasA的子类的实例后,如何再次使用它们的所有独特属性访问它们?这种机制如何运作?

4

2 回答 2

3

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

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")
}

另一种机制涉及ClassTags 和/或TypeTags(或Manifests,Scala 2.10 之前的版本左右),我不太熟悉。

于 2013-10-16T11:36:16.590 回答
0

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

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
于 2013-10-16T11:40:12.693 回答