-1 Этот ответ должен быть длиной 3-5 предложений. Все до РЕДАКТИРОВАНИЯ - пустая трата времени.

сто столкнулся с трудностями при изучении 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)

Решение Вопроса

Спецификация языка 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!
}
 Tom Crockett07 янв. 2011 г., 11:22
B происходит отA, но он пытается получить доступ не к своему защищенному членуmyMethod, но вместо этого другого экземпляра, параметрa: A, Защищенный член виден толькоэкземпляр, который содержит его (по умолчанию, хотя это можно изменить с помощью упомянутой аннотации области видимости).
 Rex Kerr07 янв. 2011 г., 11:00
Это объяснение фактически не говорит, почему код OP не работает.B является производный типAтак же, как и должно быть.
 Kim Stebel10 июн. 2011 г., 19:41
-1 Этот ответ должен быть длиной 3-5 предложений. Все до РЕДАКТИРОВАНИЯ - пустая трата времени.
 Tom Crockett15 янв. 2011 г., 05:16
@ Submonoid - вы совершенно правы, цитата не совсем применима. Пожалуйста, смотрите мои изменения в ответе.
 Submonoid14 янв. 2011 г., 17:17
Это скорее противоречит цитируемому вами отрывку: «включая другие экземпляры того же типа и любые производные типы».

Ваш ответ на вопрос