gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 05:24:18 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com