Scala:调用超类构造函数

mar*_*gio 6 scala

我正在经历Scala处理超类构造函数的奇怪行为.

我有一个非常简单的类,按以下方式定义

package server

class Content(identifier:String,content:String){
    def getIdentifier() : String    = {identifier}
    def getContent()    : String    = {content}
}
Run Code Online (Sandbox Code Playgroud)

和一个简单的子类

package server

class SubContent(identifier:String, content:String) extends Content(identifier, content+"XXX")){

    override def getContent():String = {
        println(content)
        super.getContent
    }
}
Run Code Online (Sandbox Code Playgroud)

真正奇怪的是,在子类中有超类属性的重复,所以如果我创建一个新对象

var c = new SubContent("x","x")
Run Code Online (Sandbox Code Playgroud)

执行

c.getContent
Run Code Online (Sandbox Code Playgroud)

首先打印出"x"(提供给子类构造函数的值),但返回"xXXX"(提供给超类构造函数的值).

有什么方法可以避免这种行为吗?基本上我想要的是子类不创建自己的属性,而只是将参数传递给超类.

Ran*_*ulz 8

这正是你告诉它要做的事情.在将第二个构造函数传递给超类构造函数时,您扩充了第二个构造函数参数,然后使用了超类' getContent来提供从子类返回的值' getContent.

你需要注意的是构造函数参数(那些没有绑定到属性,因为它们属于a case class或因为它们是用val关键字声明的)属于整个类体的范围.类的构造函数是它的主体中任何方法之外的部分.因此,对方法体中构造函数参数的引用会强制构造函数参数存储在字段中,以便它可以具有必要的范围.请注意,在这种情况下,您的println调用getContent会导致此类隐藏的构造函数参数字段.

回复评论 "是否有另一种方法来定义它以避免这种情况?或者至少,如果我从不参考子类构造函数的参数,它们的字段将被分配(浪费内存)?":

如果对构造函数参数(*)的唯一引用在构造函数中是正确的(即,在任何方法体之外,val并且var初始化程序不符合方法体),则不会创建不可见字段来保存构造函数参数.

但是,如果你试图"避免"比这些看不见的领域更多,我不明白你在问什么.

(*)"plain constructor parameters"是指那些不属于case类且不带有val关键字的那些.

  • 在`SubContent.getContent`中使用`super.content`而不仅仅是`content`. (3认同)