La herencia es un concepto fundamental en la programación orientada a objetos (OOP) que permite a una clase derivar propiedades y comportamientos de otra clase. En Groovy, la herencia se utiliza para promover la reutilización del código y establecer relaciones jerárquicas entre clases.

Conceptos Clave

  1. Clase Base (Superclase): La clase de la cual se heredan propiedades y métodos.
  2. Clase Derivada (Subclase): La clase que hereda propiedades y métodos de la clase base.
  3. Palabra Clave extends: Utilizada para indicar que una clase está heredando de otra.

Ejemplo Básico de Herencia

Vamos a crear un ejemplo simple para ilustrar cómo funciona la herencia en Groovy.

Clase Base: Animal

class Animal {
    String name

    void eat() {
        println("${name} is eating")
    }
}

Clase Derivada: Dog

class Dog extends Animal {
    void bark() {
        println("${name} is barking")
    }
}

Uso de las Clases

def dog = new Dog()
dog.name = "Buddy"
dog.eat()  // Output: Buddy is eating
dog.bark() // Output: Buddy is barking

Explicación del Código

  1. Clase Animal:

    • Tiene una propiedad name.
    • Tiene un método eat() que imprime un mensaje indicando que el animal está comiendo.
  2. Clase Dog:

    • Utiliza la palabra clave extends para heredar de Animal.
    • Añade un nuevo método bark() que imprime un mensaje indicando que el perro está ladrando.
  3. Uso de las Clases:

    • Creamos una instancia de Dog.
    • Asignamos un valor a la propiedad name heredada de Animal.
    • Llamamos a los métodos eat() y bark().

Sobrescritura de Métodos

La sobrescritura de métodos permite a una subclase proporcionar una implementación específica de un método que ya está definido en su superclase.

Ejemplo de Sobrescritura

class Animal {
    String name

    void eat() {
        println("${name} is eating")
    }
}

class Dog extends Animal {
    @Override
    void eat() {
        println("${name} is eating dog food")
    }
}

Uso de las Clases con Sobrescritura

def dog = new Dog()
dog.name = "Buddy"
dog.eat()  // Output: Buddy is eating dog food

Explicación del Código

  1. Sobrescritura del Método eat():
    • En la clase Dog, sobrescribimos el método eat() de la clase Animal.
    • Utilizamos la anotación @Override para indicar que estamos sobrescribiendo un método.

Ejercicio Práctico

Ejercicio

  1. Crea una clase base llamada Vehicle con las siguientes propiedades y métodos:

    • Propiedad make (marca del vehículo).
    • Propiedad model (modelo del vehículo).
    • Método start() que imprime un mensaje indicando que el vehículo está arrancando.
  2. Crea una clase derivada llamada Car que herede de Vehicle y añade:

    • Método drive() que imprime un mensaje indicando que el coche está conduciendo.
  3. Crea una instancia de Car, asigna valores a las propiedades make y model, y llama a los métodos start() y drive().

Solución

class Vehicle {
    String make
    String model

    void start() {
        println("${make} ${model} is starting")
    }
}

class Car extends Vehicle {
    void drive() {
        println("${make} ${model} is driving")
    }
}

def car = new Car()
car.make = "Toyota"
car.model = "Corolla"
car.start()  // Output: Toyota Corolla is starting
car.drive()  // Output: Toyota Corolla is driving

Explicación de la Solución

  1. Clase Vehicle:

    • Tiene las propiedades make y model.
    • Tiene un método start() que imprime un mensaje indicando que el vehículo está arrancando.
  2. Clase Car:

    • Hereda de Vehicle utilizando la palabra clave extends.
    • Añade un método drive() que imprime un mensaje indicando que el coche está conduciendo.
  3. Uso de las Clases:

    • Creamos una instancia de Car.
    • Asignamos valores a las propiedades make y model.
    • Llamamos a los métodos start() y drive().

Conclusión

En esta sección, hemos aprendido sobre la herencia en Groovy, cómo crear clases base y derivadas, y cómo sobrescribir métodos. La herencia es una herramienta poderosa en la programación orientada a objetos que permite la reutilización del código y la creación de jerarquías de clases. En el próximo tema, exploraremos las interfaces y traits en Groovy, que proporcionan otra forma de compartir comportamientos entre clases.

© Copyright 2024. Todos los derechos reservados