Polimorfismo
Parte de la sección Programación orientada a objetos del Journey de Swift de Coddy. Lección 32 de 57.
El polimorfismo significa que un fragmento de código funciona con valores de muchos tipos, y cada valor responde a su manera. El bucle de abajo llama a sound() sin saber qué animal contiene:
class Animal {
func sound() -> String { "..." }
}
class Dog: Animal {
override func sound() -> String { "Woof" }
}
class Cow: Animal {
override func sound() -> String { "Moo" }
}
let farm: [Animal] = [Dog(), Cow(), Dog()]
for a in farm { print(a.sound()) }Salida:
Woof
Moo
WoofSwift decide qué implementación ejecutar en tiempo de ejecución, a partir del objeto real. El tipo declarado de la variable no importa; importa el tipo del objeto:
class Animal {
func sound() -> String { "..." }
}
class Cat: Animal {
override func sound() -> String { "Meow" }
}
let pet: Animal = Cat()
print(pet.sound())Salida:
MeowLos protocolos ofrecen la misma flexibilidad a las estructuras y las enumeraciones. Aquí, una función imprime cualquier lista de valores Drawable:
protocol Drawable {
func draw() -> String
}
struct Line: Drawable {
let length: Int
func draw() -> String { String(repeating: "-", count: length) }
}
struct Box: Drawable {
func draw() -> String { "[ ]" }
}
func render(_ items: [any Drawable]) -> String {
items.map { $0.draw() }.joined(separator: " ")
}
print(render([Line(length: 3), Box(), Line(length: 1)]))Salida:
--- [ ] -El polimorfismo reemplaza las largas cadenas de if/switch sobre tipos de cosas. En lugar de preguntar qué es un valor y después decidir qué hacer, le pides al valor que lo haga. Añadir un nuevo tipo de cosa significa añadir un nuevo tipo, no editar cada switch:
// sin polimorfismo
if kind == "dog" { print("Woof") } else if kind == "cow" { print("Moo") }
// con polimorfismo
for animal in farm { print(animal.sound()) }Desafío
FácilAnimal tiene name, legs() (4) y describe(), que devuelve Rex has 4 legs and says Woof, construido a partir de legs() y sound(). Declara Dog (sonido Woof), Bird (2 patas, sonido Tweet) y Snake (0 patas, sonido Hiss) sobrescribiendo únicamente legs() y sound().
El código proporcionado lee las líneas dog,Rex, bird,Pip o snake,Kaa, almacena los animales en un único arreglo [Animal] e imprime describe() para cada uno.
Tu código va en Animal.swift, Dog.swift, Bird.swift y Snake.swift. main.swift contiene el código proporcionado de entrada/salida y no se puede editar.
Pruébalo tú mismo
// Código de entrada/salida suministrado: mantenlo tal como está
var input: [String] = []
while let line = readLine() { input.append(line) }
var zoo: [Animal] = []
for line in input {
let p = line.split(separator: ",").map(String.init)
switch p[0] {
case "dog": zoo.append(Dog(name: p[1]))
case "bird": zoo.append(Bird(name: p[1]))
default: zoo.append(Snake(name: p[1]))
}
}
for a in zoo { print(a.describe()) }
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Programación orientada a objetos
1Clases y objetos
Trabajar con archivosDefinir clasesMétodos y selfInicializadoresLas clases son referenciasRepaso: tarjeta de biblioteca4Encapsulación
Control de accesoSolo lectura desde fueraProtección del estadoInicializadores que pueden fallarRepaso - Cuenta bancaria7Polimorfismo y genéricos
PolimorfismoConversión de tiposFunciones genéricasTipos genéricosRepaso - Calculadora de formas2Structs y tipos por valor
StructsSemántica de valoresMétodos mutablesStruct o claseRepaso - elemento del inventario5Herencia
SubclasesSobrescritura de métodosInicializadores y superfinal y jerarquíasRepaso: jerarquía de empleados8Protocolos estándar
CustomStringConvertibleEquatableComparableHashableRepaso - Ordenamiento personalizado11Proyecto: Gestión de bibliotecas
Libros y miembrosPréstamo de librosPractica por tu cuenta: Playground de Swift