我正在阅读 http://www.scala-lang.org/docu/files/ScalaReference.pdf 中的示例 5.2.2| ==>
示例 5.2.2
防止类的客户构造新的有用的习语 该类的实例是声明该类 抽象的 和 密封 :
object
m {
abstract sealed class
C (x: Int) {
def nextC = new C(x + 1) {} } val= empty = new C(0) {}
}
例如,在上面的代码中,客户可以创建类的实例 m.C 只能打电话- 正在 下一个C 现有的方法 m.C 目的;客户无法创建 类的对象 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.
====
我无法理解继承是如何声明的!!谢谢
最佳答案
您只能从同一文件继承密封类
。但是,您可以在程序的任何位置使用该类型。
这是实例化尝试:new m.C(0)
,由于该类是抽象类,因此不允许。您必须提供一个实现,即至少一个空的构造函数主体:{}
。
但是,一旦您尝试使用 new m.C(0) {}
执行此操作,您实际上是在创建一个新的匿名类,它是 A 的子类型
,这也是不允许来自外部(另一个文件)的,因此是错误的。这就是您看到继承错误的地方。
比较这些实例化类的方法:
scala> class A
defined class A
scala> new A
res0: A = A@3fbfbd15
scala> new A {}
res1: A = $anon$1@bd978db
scala> new {} with A
res2: A = A@342fe5cf
scala> res1.getClass
res3: Class[_ <: A] = class $anon$1
scala> res2.getClass
res4: Class[_ <: A] = class A
scala> res0.getClass
res5: Class[_ <: A] = class A
scala> val a: A = res1
a: A = $anon$1@bd978db
请注意 res1
的类型与其他 resX
相比 - 它是匿名的,但它确实扩展了 A
并且可以用来代替 A
。
关于scala - 不使用 extends 关键字的 Scala 继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35126642/