不使用 extends 关键字的 Scala 继承

Inheritance in scala without using extends keyword

我正在阅读 http://www.scala-lang.org/docu/files/ScalaReference.pdf 中的示例 5.2.2 ==>

示例 5.2.2

防止 class 的客户构造新的有用的习语 class 的实例是声明 class 抽象的 和 密封 :

   object
    m {
    abstract sealed class
    C (x: Int) {
          def nextC = new C(x + 1) {} } val= empty = new C(0) {} 
}

例如,在上面的代码中,客户端可以创建 class 的实例 m.C 只能打电话- 正在 下一个C 现有的方法 m.C 目的;客户无法创建 class 的对象 m.C 直接地。实际上下面两行都是错误的:

new m.C(0)    **** error: C is abstract, so it cannot be instantiated.

new m.C(0) {}  ****error: illegal inheritance from sealed class.

====

我无法理解继承是如何声明的!!谢谢

您只能从同一文件继承 sealed class。但是,您可以在程序的任何位置使用该类型。

这是实例化尝试:new m.C(0),这是不允许的,因为 class 是抽象的。您必须提供一个实现,即至少一个空的构造函数主体:{}.

但是,一旦您尝试使用 new m.C(0) {} 执行此操作,您实际上是在创建一个新的匿名 class,它是 [=15= 的 子类型 ],这也是不允许来自外部(另一个文件)的,因此是错误的。这就是您看到继承错误的地方。

比较实例化一个class的这些方法:

scala> class A
defined class A

scala> new A
res0: A = A@3fbfbd15

scala> new A {}
res1: A = $anon@bd978db

scala> new {} with A
res2: A = A@342fe5cf

scala> res1.getClass
res3: Class[_ <: A] = class $anon

scala> res2.getClass
res4: Class[_ <: A] = class A

scala> res0.getClass
res5: Class[_ <: A] = class A

scala> val a: A = res1
a: A = $anon@bd978db

请注意 res1 的类型与其他 resX 相比 - 它是匿名的,但它确实扩展了 A 并且可以用来代替 A