El polimorfismo es uno de los pilares fundamentales de la programación orientada a objetos (POO). En Swift, el polimorfismo permite que una clase o estructura pueda ser tratada como una instancia de su clase base o protocolo, lo que facilita la reutilización de código y la flexibilidad en el diseño de software.

Conceptos Clave

  1. Polimorfismo de Subtipo: Permite que una instancia de una clase derivada sea tratada como una instancia de su clase base.
  2. Polimorfismo Paramétrico: Permite que funciones o métodos operen en diferentes tipos de datos sin cambiar su implementación.
  3. Sobrescritura de Métodos: Permite que una clase derivada proporcione una implementación específica de un método que ya está definido en su clase base.

Ejemplo Práctico

Clases Base y Derivadas

Primero, definamos una clase base Animal y dos clases derivadas Dog y Cat.

class Animal {
    func makeSound() {
        print("Some generic animal sound")
    }
}

class Dog: Animal {
    override func makeSound() {
        print("Woof!")
    }
}

class Cat: Animal {
    override func makeSound() {
        print("Meow!")
    }
}

Uso del Polimorfismo

Ahora, veamos cómo podemos usar el polimorfismo para tratar instancias de Dog y Cat como instancias de Animal.

let animals: [Animal] = [Dog(), Cat(), Dog()]

for animal in animals {
    animal.makeSound()
}

Salida esperada:

Woof!
Meow!
Woof!

Explicación del Código

  1. Definición de la Clase Base Animal:

    class Animal {
        func makeSound() {
            print("Some generic animal sound")
        }
    }
    
    • La clase Animal tiene un método makeSound que imprime un sonido genérico.
  2. Clases Derivadas Dog y Cat:

    class Dog: Animal {
        override func makeSound() {
            print("Woof!")
        }
    }
    
    class Cat: Animal {
        override func makeSound() {
            print("Meow!")
        }
    }
    
    • Las clases Dog y Cat sobrescriben el método makeSound para proporcionar su propia implementación.
  3. Uso del Polimorfismo:

    let animals: [Animal] = [Dog(), Cat(), Dog()]
    
    for animal in animals {
        animal.makeSound()
    }
    
    • Creamos un array de Animal que contiene instancias de Dog y Cat.
    • Iteramos sobre el array y llamamos al método makeSound en cada instancia. Gracias al polimorfismo, se llama a la implementación correcta del método según el tipo real del objeto.

Ejercicio Práctico

Ejercicio 1: Polimorfismo con Vehículos

  1. **Definir una clase base Vehicle con un método move que imprima "Vehicle is moving".
  2. **Crear dos clases derivadas Car y Bicycle que sobrescriban el método move para imprimir "Car is driving" y "Bicycle is pedaling", respectivamente.
  3. **Crear un array de Vehicle que contenga instancias de Car y Bicycle.
  4. **Iterar sobre el array y llamar al método move en cada instancia.

Solución

class Vehicle {
    func move() {
        print("Vehicle is moving")
    }
}

class Car: Vehicle {
    override func move() {
        print("Car is driving")
    }
}

class Bicycle: Vehicle {
    override func move() {
        print("Bicycle is pedaling")
    }
}

let vehicles: [Vehicle] = [Car(), Bicycle(), Car()]

for vehicle in vehicles {
    vehicle.move()
}

Salida esperada:

Car is driving
Bicycle is pedaling
Car is driving

Resumen

En esta sección, hemos aprendido sobre el polimorfismo en Swift, un concepto clave en la programación orientada a objetos. Hemos visto cómo las clases derivadas pueden sobrescribir métodos de la clase base y cómo podemos tratar instancias de clases derivadas como instancias de su clase base. También hemos practicado estos conceptos con ejemplos y ejercicios prácticos.

En la siguiente sección, exploraremos los Protocolos, que son una parte esencial de la programación en Swift y nos permiten definir interfaces comunes para clases, estructuras y enumeraciones.

© Copyright 2024. Todos los derechos reservados