我正在阅读http://www.scala-lang.org/docu/files/ScalaReference.pdf中的示例5.2.2 ==>
例5.2.2
防止类的客户端构造新的有用的习惯用法 该类的实例是声明该类 抽象 和 密封 :
import scrapy
class DmozItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
title = scrapy.Field
link = scrapy.Field
desc = scrapy.Field
例如,在上面的代码中,客户端可以创建类的实例 M.C 只能通过电话 - 这个 NEXTC 现有的方法 M.C 宾语;客户无法创建 班级的对象 M.C 直。实际上,以下两行都是错误的:
object
m {
abstract sealed class
C (x: Int) {
def nextC = new C(x + 1) {} } val= empty = new C(0) {}
}
====
我无法理解如何宣布继承!!谢谢
答案 0 :(得分:1)
您只能从同一个文件继承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
。