Contenidos
Composición de Clases
La composición de clases implica la creación de objetos de una clase dentro de otra para formar una relación más compleja. Esto permite reutilizar código y construir estructuras más complejas. En el siguiente ejemplo, la clase Automovil tiene un objeto Motor, y puede realizar acciones relacionadas con el motor.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
class Motor { fun encender() { println("Motor encendido") } } class Automovil { val motor = Motor() fun conducir() { motor.encender() println("Automóvil en movimiento") } } fun main() { val auto = Automovil() auto.conducir() } |
Herencia
La herencia permite que una clase herede propiedades y comportamientos de otra clase. En este ejemplo, la clase Perro hereda de la clase Animal, lo que significa que Perro comparte características generales con Animal, pero puede tener características adicionales específicas de un perro.
1 2 3 4 5 6 7 8 |
open class Animal(val nombre: String) class Perro(nombre: String, val raza: String) : Animal(nombre) fun main() { val perro = Perro("Buddy", "Labrador") println("Nombre del perro: ${perro.nombre}, Raza: ${perro.raza}") } |
Superclases y Subclases
En el ejemplo anterior, Animal es la superclase y Perro es la subclase. La superclase proporciona características generales, y la subclase puede agregar características específicas. Esto facilita la organización y reutilización del código.
Clases y Métodos Abstractos y Finales
En Kotlin, puedes declarar clases y métodos como abstractos para indicar que deben ser implementados por las clases hijas. También puedes usar la palabra clave final para evitar que una clase o método sea heredado o sobreescrito. En el siguiente ejemplo, Figura es una clase abstracta que define un método abstracto calcularArea. Las clases Circulo y Rectangulo implementan este método de manera específica.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
abstract class Figura { abstract fun calcularArea(): Double } class Circulo(val radio: Double) : Figura() { override fun calcularArea(): Double { return Math.PI * radio * radio } } final class Rectangulo(val base: Double, val altura: Double) : Figura() { override fun calcularArea(): Double { return base * altura } } |
Sobreescritura de Métodos
La sobreescritura de métodos permite cambiar la implementación de un método en una clase hija. En el ejemplo anterior, las clases Circulo y Rectangulo sobrescriben el método calcularArea definido en la clase Figura para proporcionar una implementación específica para cada tipo de figura.
Constructores y Herencia
Cuando una clase tiene una superclase, el constructor de la superclase debe llamarse durante la inicialización de la subclase. Esto se hace utilizando la palabra clave super. En el siguiente ejemplo, la clase Coche hereda de Vehiculo y llama al constructor de Vehiculo durante su inicialización.
1 2 3 4 5 6 7 8 |
open class Vehiculo(val marca: String) class Coche(marca: String, val modelo: String) : Vehiculo(marca) fun main() { val coche = Coche("Toyota", "Camry") println("Marca: ${coche.marca}, Modelo: ${coche.modelo}") } |