Polimorfismo
Parte da seção Programação Orientada a Objetos do Journey de Swift da Coddy. Lição 32 de 57.
Polimorfismo significa que um trecho de código funciona com valores de vários tipos, e cada valor responde à sua própria maneira. O loop abaixo chama sound() sem saber qual animal ele contém:
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()) }Saída:
Woof
Moo
WoofSwift decide qual implementação executar em tempo de execução, com base no objeto real. O tipo declarado da variável não importa; o tipo do objeto importa:
class Animal {
func sound() -> String { "..." }
}
class Cat: Animal {
override func sound() -> String { "Meow" }
}
let pet: Animal = Cat()
print(pet.sound())Saída:
MeowOs protocolos oferecem a mesma flexibilidade para structs e enums. Aqui, uma função imprime qualquer 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)]))Saída:
--- [ ] -O polimorfismo substitui longas cadeias de if/switch sobre tipos de coisas. Em vez de perguntar o que é um valor e então decidir o que fazer, você pede ao valor que faça isso. Adicionar um novo tipo significa adicionar um novo tipo, não editar cada switch:
// sem polimorfismo
if kind == "dog" { print("Woof") } else if kind == "cow" { print("Moo") }
// com polimorfismo
for animal in farm { print(animal.sound()) }Desafio
FácilAnimal tem name, legs() (4) e describe(), que retorna Rex has 4 legs and says Woof, construído a partir de legs() e sound(). Declare Dog (som Woof), Bird (2 pernas, som Tweet) e Snake (0 pernas, som Hiss) sobrescrevendo apenas legs() e sound().
O código fornecido lê as linhas dog,Rex, bird,Pip ou snake,Kaa, armazena os animais em um único array [Animal] e imprime describe() para cada um.
Seu código deve estar em Animal.swift, Dog.swift, Bird.swift e Snake.swift. main.swift contém o código fornecido de entrada/saída e não pode ser editado.
Experimente você mesmo
// Código de entrada/saída fornecido: mantenha-o 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 lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Programação Orientada a Objetos
1Classes e Objetos
Trabalhando com ArquivosDefinindo ClassesMétodos e selfInicializadoresClasses são ReferênciasRevisão - Cartão da Biblioteca4Encapsulamento
Controle de AcessoSomente Leitura ExternaProtegendo o EstadoInicializadores que Podem FalharRevisão - Conta Bancária7Polimorfismo e Genéricos
PolimorfismoConversão de TiposFunções GenéricasTipos GenéricosRevisão - Calculadora de Formas2Structs e Tipos de Valor
StructsSemântica de ValorMétodos MutáveisStruct ou ClasseRecapitulação - Item de Inventário5Herança
SubclassesSobrescrita de métodosInicializadores e superfinal e hierarquiasRecapitulação - Hierarquia de funcionários8Protocolos Padrão
CustomStringConvertibleEquatableComparableHashableRecapitulação - Ordenação Personalizada11Projeto: Gerenciamento de Biblioteca
Livros e MembrosEmpréstimo de LivrosPratique por conta própria: Playground de Swift