scala - 不使用 extends 关键字的 Scala 继承

标签 scala inheritance sealed

我正在阅读 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/

相关文章:

scala - 加密变量的流畅匹配

php - 在父类中使用 $this 仅显示子类中的父类属性

java - 密封类是否在 Java 中强制执行,如果是,如何执行?

c++ - 将成员函数指针传递给父类

c# - 具有私有(private)构造函数的类和具有私有(private)构造函数的密封类有什么区别?

f# - 如何在 FSharp 中编写不可变的 TallySet(计数多重集)

algorithm - 使用递归的背包解决方案

scala - 不同类型的可变大小输入

scala - 函数可以返回不共享共同祖先的多种类型之一吗?

java - 当需要父类(super class)时返回 Java 中的子类