Saltar a contenido

Programación orientada a objetos

Definición y creación de objetos

En Kotlin todo es un objeto. Podemos definir clases y crear objetos a partir de ellas.

Declaración de una clase simple

class Persona(val nombre: String, var edad: Int)
  • val → propiedad inmutable.
  • var → propiedad mutable.

Crear un objeto

fun main() {
    val persona1 = Persona("Ana", 30)
    println("Nombre: ${persona1.nombre}, Edad: ${persona1.edad}")

    persona1.edad = 31
    println("Edad actualizada: ${persona1.edad}")
}

Métodos dentro de una clase

class Coche(val marca: String, var velocidad: Int) {
    fun acelerar() {
        velocidad += 10
    }
}
fun main() {
    val miCoche = Coche("Toyota", 100)
    miCoche.acelerar()
    println("Velocidad: ${miCoche.velocidad}")
}

Ejemplo de manejo de objetos

class Persona(val nombre: String, var edad: Int) {

    fun presentarse() {
        println("Hola, soy $nombre y tengo $edad años.")
    }
}
class Empleado(nombre: String, edad: Int, val puesto: String, var salario: Double) 
    : Persona(nombre, edad) {

    fun trabajar() {
        println("$nombre está trabajando como $puesto.")
    }

    fun mostrarSalario() {
        println("El salario de $nombre es $salario €.")
    }
}
fun main() {
    val persona = Persona("Ana", 28)
    persona.presentarse()

    val empleado = Empleado("Carlos", 35, "Desarrollador", 2800.0)
    empleado.presentarse()       // heredado de Persona
    empleado.trabajar()
    empleado.mostrarSalario()
}

class vs data class

Si usamos data class en Kotlin, qseue añade automáticamente `toString(), equals(), hashCode() y copy()

data class Persona(val nombre: String, var edad: Int) {

    fun presentarse() {
        println("Hola, soy $nombre y tengo $edad años.")
    }
}
data class Empleado(
    val puesto: String,
    var salario: Double,
    val nombreEmpleado: String,
    var edadEmpleado: Int
) : Persona(nombreEmpleado, edadEmpleado) {

    fun trabajar() {
        println("$nombreEmpleado está trabajando como $puesto.")
    }

    fun mostrarSalario() {
        println("El salario de $nombreEmpleado es $salario €.")
    }
}
fun main() {
    val persona = Persona("Ana", 28)
    persona.presentarse()
    println(persona.toString())  // generado automáticamente por data class

    val empleado = Empleado("Desarrollador", 2800.0, "Carlos", 35)
    empleado.presentarse()       // heredado de Persona
    empleado.trabajar()
    empleado.mostrarSalario()

    // Usando copy() (disponible en data class)
    val empleado2 = empleado.copy(salario = 3000.0)
    println(empleado2.toString())
}

A tener en cuenta

Con data class:

  • Menos código repetitivo.
  • Métodos útiles (toString(), copy(), equals()) vienen listos.
  • Muy recomendable para modelos de datos en apps.

Actividades (no evaluables)

  • AR K01. Crea una clase llamada Producto que tenga como atributos el nombre y el precio. La clase debe permitir:

    • Mostrar la información del producto (nombre y precio).
    • Aplicar un descuento al precio.

    Tareas:

    • Crea varios objetos Producto.
    • Aplica descuentos diferentes a cada producto.
    • Muestra el precio final después de aplicar el descuento.
  • AR K02. Crea una clase base llamada Animal que tenga como atributo el nombre y un método llamado hacerSonido(). Después, crea una clase Perro que herede de Animal y sobrescriba el método hacerSonido(). Además, añade un método propio de la clase Perro.

    Tareas:

    • Crea un objeto de tipo Animal y un objeto de tipo Perro.
    • Llama al método hacerSonido() en ambos casos y observa la diferencia.
    • Añade una nueva clase Gato que también herede de Animal e implemente su propio sonido.
    • Crea una lista de animales (perros, gatos, animales genéricos) y recórrela invocando el método hacerSonido() en todos los casos.