Я не часто использую наследование, поэтому я не уверен, почему он не работает. В моем проекте у меня есть следующие вещи:Доступ к защищенному члену базового класса
Базовых запечатанный класс с защищаемым элементом:
sealed class TheRoot {
protected def some: String = "TheRoot"
}
И это потомок с некоторой логикой:
final case class Descendant() extends TheRoot {
def call: Unit = {
val self: TheRoot = this
self.some // <<- throw compilation error
}
}
Compiling выше дает мне следующую ошибку:
error: method some in class TheRoot cannot be accessed in TheRoot
Access to protected method some not permitted because
prefix type TheRoot does not conform to
class Descendant where the access take place
self.some
Я не совсем уверен, в чем проблема вызова защищенного член из класса супер ... Но это становится все более интересным, если мы обернуть его в объект компаньон, она волшебным образом исправляет проблему:
sealed class TheRoot {
protected def some: String = "TheRoot"
}
object TheRoot {
final case class Descendant() extends TheRoot {
def call: Unit = {
val self: TheRoot = this
self.some // <<- NO ERROR!
}
}
}
// Exiting paste mode, now interpreting.
defined class TheRoot
defined object TheRoot
мне нужно преобразовывать тип текущего объекта, мой пример упрощен. В вашей цитате вы также имеете «защищенный член доступен только из подклассов класса», вот почему я спрашиваю, для меня «потомок» является подклассом «TheRoot». Я знаю механику сопутствующих объектов, но мне непонятно, почему она разрешает защищенный доступ в этом случае. – 4lex1v
Зачем вам нужно пересказывать 'this' в супертип? Вы можете использовать подтип в любом месте, которое принимает подтип (за исключением контравариантных аргументов, конечно) ... Во всяком случае, просмотр вашего защищенного члена в охватывающий пакет ('protected [p] def some: String = ...') также должен работайте как ваш пример с приложением 'Descendant' в объекте. – Sergey
@ 4lex1v Извините, я неправильно понял ваш вопрос раньше. Я нашел еще одну странную вещь. это работает, но сам. – Jerry