#kotlin #overriding #extension-methods
#kotlin #переопределение #расширение-методы
Вопрос:
Я могу написать код, подобный этому:
open class A{
open fun String.q(){
print("a")
}
open fun z(){
val s:String=""
s.q()
}
}
class B : A(){
override fun String.q() {
print("b")
}
override fun z(){
val s:String=""
s.q()
}
}
fun main(args: Array<String>) {
val a : A = B()
a.z()
}
И это обычно работает. Более того, если я удалю модификатор «переопределенный» из строки.q() в классе B компилятор говорит, что это неправильно. Я слышал, что я не могу переопределить методы расширения в Kotlin. Это ошибка или какая-то особенность?
Комментарии:
1. Может быть, я что-то неправильно понял в теоретической части?
2. Его расширение в локальной области видимости, расширения являются синтетическим сахаром, оно представлено как
open fun q(a: String)
в байт-коде. Вы можете переопределить это внутри области, вот класс B. Хотя, если вы сделаете то же самое на верхнем уровне, вы не сможете, потому что в одном файле может находиться только 1 функция расширения с тем же именем, и вы не можете расширять файл как класс.