Módulo 9-10: Programación Orientada a Objetos (Avanzada)
Herencia, polimorfismo y patrones de diseño
🚀 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.