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
   }
}  
Si a una clase anidada le anteponemos el modificador inner la transforma-mos en interna, con lo que conseguimos que la clase pueda acceder a todos los miembros de la clase externa.

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