Проверка и корректировка кода классов-родителя и наследника

Код не компилируется: ParentClass закрыт для наследования, age нельзя переопределить, а friendName принадлежит экземпляру Nested. Нужно явно открыть класс и свойство и создать Nested.

Короткий ответ

Что ответить на собеседовании

Код не компилируется: ParentClass закрыт для наследования, age нельзя переопределить, а friendName принадлежит экземпляру Nested. Нужно явно открыть класс и свойство и создать Nested.

Подробный разбор

Ответ с пояснениями

Условие

Требуется выявить и устранить ошибки в следующем фрагменте кода.

class ParentClass {
    private val age = 10
    protected val name = "Bob"

    protected class Nested {
        public val friendName: String = "Alice"
    }
}

class ChildClass : ParentClass() {
    override val age = 25

    fun tryIt() {
        println("$name is $age")
        println("${Nested.friendName} friend for $name")
    }
}

Ответ

Код не компилируется: ParentClass закрыт для наследования, age нельзя переопределить, а friendName принадлежит экземпляру Nested. Нужно явно открыть класс и свойство и создать Nested.

Один вариант исправления:

open class ParentClass {
    protected open val age = 10
    protected val name = "Bob"
    protected class Nested {
        val friendName = "Alice"
    }
}
class ChildClass : ParentClass() {
    override val age = 25
    fun tryIt() {
        println("$name is $age")
        println("${Nested().friendName} friend for $name")
    }
}

Вызов ChildClass().tryIt() выведет Bob is 25 и Alice friend for Bob. Изменение private age на protected open — осознанное изменение контракта, необходимое для показанного override.

Источник: kotlinlang.org.

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

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

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

Подробнее