Код не компилируется: 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.