La herencia es un concepto fundamental en la programación orientada a objetos (OOP) que permite a una clase (subclase o clase derivada) heredar atributos y métodos de otra clase (superclase o clase base). En Ruby, la herencia se utiliza para crear una jerarquía de clases que comparten comportamientos comunes, lo que facilita la reutilización del código y la organización lógica del mismo.

Conceptos Clave

  1. Superclase y Subclase:

    • Superclase: La clase de la cual se heredan atributos y métodos.
    • Subclase: La clase que hereda atributos y métodos de la superclase.
  2. Palabra clave super:

    • Utilizada dentro de un método en la subclase para llamar al método correspondiente en la superclase.
  3. Sobrescritura de Métodos:

    • La subclase puede redefinir métodos de la superclase para proporcionar una implementación específica.

Ejemplo Práctico

Definiendo una Superclase

class Animal
  def initialize(name)
    @name = name
  end

  def speak
    "Hello, I am an animal."
  end
end

Definiendo una Subclase

class Dog < Animal
  def speak
    "Woof! My name is #{@name}."
  end
end

Uso de la Herencia

# Creando una instancia de la superclase
animal = Animal.new("Generic Animal")
puts animal.speak
# Output: Hello, I am an animal.

# Creando una instancia de la subclase
dog = Dog.new("Buddy")
puts dog.speak
# Output: Woof! My name is Buddy.

Explicación del Código

  1. Superclase Animal:

    • Tiene un método initialize que establece el nombre del animal.
    • Tiene un método speak que devuelve una cadena de texto.
  2. Subclase Dog:

    • Hereda de Animal usando <.
    • Redefine el método speak para proporcionar una implementación específica para los perros.

Uso de super

La palabra clave super se utiliza para llamar al método de la superclase desde la subclase. Esto es útil cuando deseas extender la funcionalidad de un método heredado sin reemplazarlo por completo.

class Dog < Animal
  def initialize(name, breed)
    super(name)  # Llama al método initialize de la superclase
    @breed = breed
  end

  def speak
    super + " I am a #{@breed}."
  end
end

dog = Dog.new("Buddy", "Golden Retriever")
puts dog.speak
# Output: Hello, I am an animal. I am a Golden Retriever.

Ejercicio Práctico

Ejercicio 1: Crear una Jerarquía de Clases

  1. Define una superclase Vehicle con los siguientes atributos y métodos:

    • Atributo make (marca del vehículo).
    • Método initialize que establece el atributo make.
    • Método description que devuelve una cadena de texto con la marca del vehículo.
  2. Define una subclase Car que herede de Vehicle y añada los siguientes atributos y métodos:

    • Atributo model (modelo del coche).
    • Método initialize que establece los atributos make y model.
    • Método description que sobrescriba el método de la superclase para incluir el modelo del coche.

Solución

class Vehicle
  def initialize(make)
    @make = make
  end

  def description
    "This is a vehicle made by #{@make}."
  end
end

class Car < Vehicle
  def initialize(make, model)
    super(make)
    @model = model
  end

  def description
    super + " The model is #{@model}."
  end
end

# Prueba de la jerarquía de clases
vehicle = Vehicle.new("Toyota")
puts vehicle.description
# Output: This is a vehicle made by Toyota.

car = Car.new("Toyota", "Corolla")
puts car.description
# Output: This is a vehicle made by Toyota. The model is Corolla.

Resumen

En esta sección, hemos aprendido sobre la herencia en Ruby, un concepto clave en la programación orientada a objetos. Hemos visto cómo una subclase puede heredar atributos y métodos de una superclase, cómo sobrescribir métodos y cómo utilizar la palabra clave super para extender la funcionalidad de los métodos heredados. La herencia nos permite crear jerarquías de clases que facilitan la reutilización y organización del código.

En la próxima sección, exploraremos los módulos y mixins, que proporcionan otra forma de compartir comportamientos entre clases en Ruby.

© Copyright 2024. Todos los derechos reservados