Tipos de clases en Kotlin: abiertas, abstractas, internas y con alias
video[Tutorial] Tipos de clases en Kotlin abiertas, abstractas, internas y con alias
Al igual que sucede con Java, las clases abstractas de Kotlin son clases que no pueden ser instanciadas. Su finalidad es utilizarlas de cara a proveer una plantilla común para otras clases que las extiendan.
La forma de declarar una clase abstracta es mediante la palabra reservada abstract. Una clase abstracta podrá contener propiedades y funciones tanto abstractas (marcándolas con la palabra reservada abstract) como no abstractas:
abstract class Vehiculo(val nombre: String, val color: String, val peso: Double) { // Propiedades no abstrac-tas abstract var maxVelocidad: Double // Propiedad abstracta abstract fun arrancar() // función abstractos abstract fun parar() fun muestraDetalless() { // función no abstracto println("Nombre: $nombre, Color: $color, Velicidad: $maxVelocidad ") } }Cualquier subclase que extienda de una clase abstracta deberá implementar todos los métodos y variables abstractas de la misma, o bien declararse a su vez como abstracta.
De acuerdo a lo que vimos en la herencia de clases, sería necesario utilizar la palabra reservada open para indicar que podemos heredar de esa clase. Sin embargo, con las clases abstractas no es necesario hacerlo, ya que incorporan esa propiedad por defecto. Veamos un ejemplo de cómo extender una clase abstracta:
class Coche(nombre: String, color: String, peso: Double, override var maxVelocidad: Double): Vehiculo(nombre, color, peso) { override fun arrancar() { println("Coche arrancado") } override fun parar() { println("Coche parado") } }
Clases anidadas e iternas
En Kotlin una clase puede declararse dentro de otra dando lugar a una clase anidada.
class Externa { private val propiedad: Int = 1 class Anidada { fun funcion() = 2 } } |
class Externa { private val propiedad: Int = 1 inner class Interna { fun funcion() = propiedad } } |
Type Alias
Una de las cosas interesantes que podemos hacer en Kotlin es asignar un alias a un tipo de dato, siendo de gran utilidad para acortar el nombre de tipos de datos cuando son muy largos o si queremos aclarar el significado:typealias GrupoPersonas = Set<Persona> typealias TablaFicheros<K> = MutableMap<K, Mutable-List<File>>
Incluso se puede aplicar a tipos de función:
typealias Manejador = (Int, String, Any) -> Unit typealias Predicado<T> = (T) -> Boolean