В Subclass доступны b, c в том же модуле, d и тип Nested; a недоступно. В Unrelated доступны только d и c в том же модуле, но не protected b или Nested.
Определение доступности полей и вложенных классов
В Subclass доступны b, c в том же модуле, d и тип Nested; a недоступно. В Unrelated доступны только d и c в том же модуле, но не protected b или Nested.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Укажите, какие из перечисленных членов видимы в комментариях к коду.
open class Outer {
private val a = 1
protected open val b = 2
internal open val c = 3
val d = 4
protected class Nested {
public val e: Int = 5
}
}
class Subclass : Outer() {
// видно ли a?
// видно ли b?
// видно ли c?
// видно ли d?
// видно ли Nested?
// видно ли e?
}
class Unrelated(o: Outer) {
// видно ли o.a?
// видно ли o.b?
// видно ли o.c?
// видно ли o.d?
// видно ли Outer.Nested и Nested::e?
}
Ответ
В Subclass доступны b, c в том же модуле, d и тип Nested; a недоступно. В Unrelated доступны только d и c в том же модуле, но не protected b или Nested.
Поле e не является членом Outer или Subclass: внутри наследника к нему обращаются через Nested().e. У public e нет смысла вне контекста доступного экземпляра, если сам тип Nested скрыт protected. При переносе Unrelated в другой модуль пропадёт доступ к internal c. Kotlin protected не даёт доступ всем классам пакета, как иногда ожидают после Java.
Источник: kotlinlang.org.