Clase anidada de Kotlin y clase interna

Clase anidada

Una clase se declara dentro de otra clase y luego se llama clase anidada . De forma predeterminada, la clase anidada es estática , por lo que podemos acceder a la propiedad de la clase anidada o a las variables mediante la notación de punto (.) sin crear un objeto de la clase.
Sintaxis de la declaración: 

class outerClass {
       ............
      // outer class properties or member function
      
      class nestedClass { 
            ..........
            // inner class properties or member function
      }
}

Nota: la clase anidada no puede acceder a los miembros de la clase externa, pero podemos acceder a la propiedad de la clase anidada desde la clase externa sin crear un objeto para la clase anidada.

Programa Kotlin para acceder a propiedades de clase anidadas: 

Kotlin

// outer class declaration
class outerClass {
    var str = "Outer class"
    // nested class declaration
    class nestedClass {
        val firstName  = "Praveen"
        val lastName = "Ruhil"
    }
}
fun main(args: Array<String>) {
    // accessing member of Nested class
    print(outerClass.nestedClass().firstName)
    print(" ")
    println(outerClass.nestedClass().lastName)
}

Producción: 

Praveen Ruhil

En Kotlin, para acceder a la función miembro de la clase anidada, necesitamos crear el objeto para la clase anidada y llamar a la función miembro usándolo.

Programa Kotlin para acceder a la función de miembro de clase anidada:

Kotlin

// outer class declaration
class outerClass {
    var str = "Outer class"
    // nested class declaration
    class nestedClass {
        var s1 = "Nested class"
        // nested class member function
        fun nestfunc(str2: String): String {
            var s2 = s1.plus(str2)
            return s2
        }
    }
}
fun main(args: Array<String>) {
    // creating object of Nested class
    val nested = outerClass.nestedClass()
    // invoking the nested member function by passing string
    var result = nested.nestfunc(" member function call successful")
    println(result)
}

Producción:  

Nested class member function call successful

Comparación con Java

Las clases de Kotlin son muy similares a las clases de Java cuando pensamos en las capacidades y los casos de uso, pero no son idénticas. Anidado en Kotlin es similar a una clase anidada estática en Java y la clase interna es similar a una clase anidada no estática en Java.  

Clase interna de Kotlin

Cuando podemos declarar una clase dentro de otra clase usando la palabra clave interior , entonces se llama clase interior. Con la ayuda de la clase interna, podemos acceder a la propiedad de la clase externa dentro de la clase interna. 

class outerClass {
       ............
      // outer class properties or member function
      
      inner class innerClass { 
            ..........
            // inner class properties or member function
      }
}

En el siguiente programa, estamos tratando de acceder a str desde la función miembro de la clase interna. Pero no funciona y da un error en tiempo de compilación. 
Programa Kotlin de clase interna:

Kotlin

// outer class declaration
class outerClass {
    var str = "Outer class"
    // innerClass declaration without using inner keyword
    class innerClass {
        var s1 = "Inner class"
        fun nestfunc(): String {
            // can not access the outer class property str
            var s2 = str
            return s2
        }
    }
}
// main function
fun main(args: Array<String>) {
    // creating object for inner class
    val inner= outerClass().innerClass()
    // inner function call using object
    println(inner.nestfunc())
}

Producción: 

Error:(9, 22) Kotlin: Unresolved reference: str

Primero, use la palabra clave interna delante de la clase interna. Luego, cree una instancia de la clase externa, de lo contrario no podemos usar las clases internas.

Kotlin

// outer class declaration
class outerClass {
    var str = "Outer class"
    // innerClass declaration with using inner keyword
    inner class innerClass {
        var s1 = "Inner class"
        fun nestfunc(): String {
            // can access the outer class property str
            var s2 = str
            return s2
        }
    }
}
// main function
fun main(args: Array<String>) {
    // creating object for inner class
    val inner= outerClass().innerClass()
    // inner function call using object
    println(inner.nestfunc()+" property accessed successfully from inner class ")
}

Producción:  

Outer class property accessed successfully from inner class

Publicación traducida automáticamente

Artículo escrito por Praveenruhil y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *