加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala:调用超类构造函数

发布时间:2020-12-16 18:51:43 所属栏目:安全 来源:网络整理
导读:我正在经历 Scala处理超类构造函数的奇怪行为. 我有一个非常简单的类,按以下方式定义 package serverclass Content(identifier:String,content:String){ def getIdentifier() : String = {identifier} def getContent() : String = {content}} 和一个简单的
我正在经历 Scala处理超类构造函数的奇怪行为.

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

package server

class Content(identifier:String,content:String){
    def getIdentifier() : String    = {identifier}
    def getContent()    : String    = {content}
}

和一个简单的子类

package server

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

    override def getContent():String = {
        println(content)
        super.getContent
    }
}

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

var c = new SubContent("x","x")

执行

c.getContent

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

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

解决方法

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

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

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

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读