Определение доступности полей и вложенных классов

В 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.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее