Проходя курс "Kotlin для Java Developers" Coursera , я натолкнулся на эту конструкцию, в которой функция расширения для отдельного экземпляра, похоже, имеет доступ к закрытым полям содержащего класса. , Обратите внимание, как класс Data
реализован вне Container
и не имеет доступа к полям Container
, но функция расширения Data.printMe()
может получить доступ к приватному Container
containerVal
member:
data class Data (val data: String)
class Container (private val containerVal: String, val data: Data){
fun Data.printMe() {
println("data: $data - in container: ${this@Container.containerVal}")
}
}
fun main() {
val c = Container("mycontainer", Data("mydata"))
// Can I call Data.printMe without using `with`?
// val d = c.data.printMe();
with (c) {
// Prints: data: mydata - in container: mycontainer
data.printMe();
}
}
Довольно круто, что Data.printMe
может получить доступ к Container
приватным пользователям. with(c)
, по-видимому, это позволяет. Я вижу множество вариантов использования для этого, например, как в примере примера функции расширения для Cell
s игры могут получить доступ к содержащему Board
без того, чтобы сам класс Cell
был загрязнен и тесно связан с Board
.
У этого "подхода" есть имя? И есть ли синтаксис для вызова c.data.printMe
"напрямую" без использования with
? с документацией не упоминает этот вариант использования.