不使用extends关键字在scala中继承

时间:2016-02-01 09:11:54

标签: scala inheritance sealed

我正在阅读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) {} 
}

====

我无法理解如何宣布继承!!谢谢

1 个答案:

答案 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