🚀 Módulo 9-10: Programación Orientada a Objetos (Avanzada)

Duración: Semanas 9 y 10

Objetivos del Módulo

  • Dominar herencia y polimorfismo
  • Entender y usar módulos y mixins
  • Aplicar patrones de diseño básicos
  • Crear jerarquías de clases eficientes

Contenido Teórico

1. Herencia

La herencia permite crear nuevas clases basadas en clases existentes:

class Vehicle
  attr_accessor :brand, :model, :year
  
  def initialize(brand, model, year)
    @brand = brand
    @model = model
    @year = year
  end
  
  def start
    "El #{@brand} #{@model} está arrancando..."
  end
  
  def stop
    "El vehículo se ha detenido."
  end
end

class Car < Vehicle
  attr_accessor :door_count
  
  def initialize(brand, model, year, door_count)
    super(brand, model, year)  # Llamar al constructor padre
    @door_count = door_count
  end
  
  def start
    "#{super} ¡Vroom vroom!"  # Extender el método padre
  end
end

class Motorcycle < Vehicle
  def start
    "La motocicleta #{@brand} rugió al arrancar"
  end
  
  def wheelie
    "¡Caballito en la #{@brand}!"
  end
end

2. Módulos y Mixins

Los módulos permiten compartir código entre clases:

module Drivable
  def accelerate
    "Acelerando..."
  end
  
  def brake
    "Frenando..."
  end
end

module Electric
  def charge_battery
    "Cargando batería eléctrica..."
  end
  
  def battery_level
    @battery ||= 100
  end
end

class ElectricCar < Vehicle
  include Drivable
  include Electric
  
  def initialize(brand, model, year)
    super(brand, model, year)
    @battery = 100
  end
  
  def start
    if battery_level > 10
      "Arrancando silenciosamente..."
    else
      "Batería baja, necesita carga"
    end
  end
end

3. Polimorfismo

Diferentes objetos responden al mismo mensaje de manera diferente:

class Animal
  def make_sound
    "Algún sonido"
  end
end

class Dog < Animal
  def make_sound
    "¡Guau guau!"
  end
end

class Cat < Animal
  def make_sound
    "¡Miau!"
  end
end

class Cow < Animal
  def make_sound
    "¡Muuu!"
  end
end

# Polimorfismo en acción
animals = [Dog.new, Cat.new, Cow.new]
animals.each { |animal| puts animal.make_sound }

4. Patrones de Diseño Básicos

Singleton

class AppConfiguration
  @@instance = nil
  
  private_class_method :new
  
  def self.instance
    @@instance ||= new
  end
  
  def initialize
    @settings = {}
  end
  
  def set(key, value)
    @settings[key] = value
  end
  
  def get(key)
    @settings[key]
  end
end

Factory

class VehicleFactory
  def self.create_vehicle(type, brand, model, year)
    case type.downcase
    when 'car'
      Car.new(brand, model, year, 4)
    when 'motorcycle'
      Motorcycle.new(brand, model, year)
    when 'electric'
      ElectricCar.new(brand, model, year)
    else
      raise "Tipo de vehículo no reconocido: #{type}"
    end
  end
end

Ejercicios Prácticos

Ve al archivo ejercicios.rb para practicar los conceptos aprendidos.

Proyecto del Módulo

Ve al archivo proyecto_juego_rpg.rb para completar el proyecto de este módulo.