Scala:调用超类构造函数
我正在经历
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关键字的那些. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |