Scala: вызов конструктора суперкласса - PullRequest
6 голосов
/ 03 сентября 2010

Я испытываю странное поведение при обработке в 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» (значение, предоставленное конструктору суперкласса).

Есть ли способ избежать такого поведения? По сути, мне бы хотелось, чтобы подкласс не создавал свои собственные атрибуты, а просто передавал параметры суперклассу.

1 Ответ

8 голосов
/ 03 сентября 2010

Он делает именно то, что вы сказали.Вы добавили второй параметр конструктора при передаче его в конструктор суперкласса, а затем использовали суперкласс 'getContent, чтобы предоставить значение, возвращаемое из подкласса' getContent.

.из-за того, что параметры конструктора (те, которые не привязаны к свойствам, потому что они являются частью case class или потому что они были объявлены с ключевым словом val) находятся в области видимости всего тела класса.Конструктор класса - это та часть его тела, которая вне любого метода.Таким образом, ссылки на параметры конструктора в теле метода вынуждают параметр конструктора быть сохраненным в поле, чтобы он имел необходимую степень.Обратите внимание, что ваш println вызов в getContent вызывает в этом случае такое скрытое поле параметра конструктора.

Ответ на комментарий"Есть ли альтернативный способ определить его, чтобычтобы избежать этого? Или, по крайней мере, если я никогда не буду ссылаться на параметры конструкторов подкласса, их поля будут выделены (истощение памяти)? ":

Если единственные ссылки на параметры простого конструктора (*) находятся вСобственно конструктор (т. е. вне какого-либо тела метода, а инициализаторы val и var не квалифицируются как тела метода), тогда не будет создано невидимое поле для хранения параметра конструктора.

Однако, если естьбольше, чем вы пытаетесь «избежать», чем эти невидимые поля, я не понимаю, о чем вы спрашиваете.

(*) Под «простыми параметрами конструктора» я подразумеваю те, которые не являются частью класса case ине содержит ключевое слово val.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...