В это руководстве рассмотрим вложенные и внутренние классы в Kotlin.
Вложенный класс
Вложенный (Nested) класс — это такой класс, который создается внутри другого класса. В Kotlin вложенный класс по умолчанию является статическим, поэтому доступ к его члену данных и функции-члену можно получить без создания объекта класса. Вложенный класс не может получить доступ к элементу данных внешнего класса.
class outerClass{
//outer class code
class nestedClass{
//nested class code
}
}
Пример вложенного класса Kotlin
class outerClass{
private var name: String = "Ashu"
class nestedClass{
var description: String = "code inside nested class"
private var id: Int = 101
fun foo(){
// print("name is ${name}") // cannot access the outer class member
println("Id is ${id}")
}
}
}
fun main(args: Array){
// nested class must be initialize
println(outerClass.nestedClass().description) // accessing property
var obj = outerClass.nestedClass() // object creation
obj.foo() // access member function
}
Выход:
code inside nested class Id is 101
Внутренний класс
Внутренний (Inner) класс в Котлин — это класс, созданный внутри другого класса с ключевым словом inner. Другими словами, мы можем сказать, что вложенный класс, помеченный как «внутренний», называется внутренним классом.
Внутренний класс нельзя объявлять внутри интерфейсов или невнутренних вложенных классов.
class outerClass{
//outer class code
inner class innerClass{
//nested class code
}
}
Преимущество внутреннего класса по сравнению с вложенным классом заключается в том, что он может получить доступ к членам внешнего класса, даже если он является закрытым. Внутренний класс хранит ссылку на объект внешнего класса.
Пример внутреннего класса Kotlin
class outerClass{
private var name: String = "Ashu"
inner class innerClass{
var description: String = "code inside inner class"
private var id: Int = 101
fun foo(){
println("name is ${name}") // access the outer class member even private
println("Id is ${id}")
}
}
}
fun main(args: Array){
println(outerClass().innerClass().description) // accessing property
var obj = outerClass().innerClass() // object creation
obj.foo() // access member function
}
Выход:
code inside inner class name is Ashu Id is 101
