Защищенные члены других экземпляров в Scala - PullRequest
9 голосов
/ 07 января 2011

Я только что столкнулся с трудностями при изучении Scala. У меня есть иерархия наследования, которая по существу эквивалентна этому:

class A {
    protected def myMethod() = println("myMethod() from A")
}

class B extends A {
    def invokeMyMethod(a: A) = a.myMethod()
}

Но, пытаясь скомпилировать этот пример, я получаю сообщение об ошибке «test.scala: 7: error: метод myMethod недоступен в A».

Исходя из Java, я понимаю, что защищенные члены должны быть доступны в любой момент из производного класса, и нигде я не видел ничего, что говорило бы мне о том, что защищенные члены в Scala ограничены экземпляром. У кого-нибудь есть объяснение этому?

1 Ответ

17 голосов
/ 07 января 2011

Цитирование Спецификации языка Scala :

Защищенный идентификатор x может использоваться в качестве имени элемента в выборе r .x только если применяется одно из следующих:

- Доступ осуществляется внутри шаблона, определяющего член, или, если дана квалификация C, внутри пакета C, или класса C, или его сопутствующего модуля, или

- r это одно из зарезервированных слов this и super, или

- тип r соответствует экземпляру типа класса, который содержит доступ.

Эти три правила определяют, когда именно экземпляру разрешается доступ к защищенным членам другого экземпляра. Интересно отметить, что по последнему правилу, когда B расширяет A, экземпляр A может получить доступ к защищенным членам другого экземпляра B ..., но к экземпляру B не может получить доступ к защищенным членам другого A! Другими словами:

class A {
    protected val aMember = "a"
    def accessBMember(b: B) = b.bMember // legal!
}

class B extends A {
    protected val bMember = "b"
    def accessAMember(a: A) = a.aMember // illegal!
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...