Sobrescrita de métodos
Parte da seção Programação Orientada a Objetos do Journey de Swift da Coddy. Lição 23 de 57.
Uma subclasse pode substituir um método herdado por sua própria versão. A palavra-chave override é obrigatória, o que impede a substituição acidental de um método:
class Animal {
func sound() -> String { "..." }
}
class Dog: Animal {
override func sound() -> String { "Woof" }
}
class Cat: Animal {
override func sound() -> String { "Meow" }
}
print(Dog().sound())
print(Cat().sound())
print(Animal().sound())Saída:
Woof
Meow
...super.method() chama a versão da superclasse de dentro da sobrescrita, permitindo que a subclasse adicione algo ao comportamento herdado em vez de substituí-lo completamente:
class Report {
func text() -> String { "Sales: 120" }
}
class SignedReport: Report {
override func text() -> String {
super.text() + " (signed by Ada)"
}
}
print(SignedReport().text())Saída:
Sales: 120 (signed by Ada)Propriedades calculadas também podem ser sobrescritas, com override var:
class Shape {
var sides: Int { 0 }
var summary: String { "\(sides) sides" }
}
class Triangle: Shape {
override var sides: Int { 3 }
}
print(Triangle().summary)Saída:
3 sidesA substituição também é executada quando o método é chamado a partir de código herdado: summary acima é escrito em Shape, mas usa os sides de Triangle. Swift sempre chama a versão do objeto real, que é o que torna a substituição útil:
class Greeter {
func name() -> String { "someone" }
func greet() -> String { "Hello, \(name())" }
}
class AdaGreeter: Greeter {
override func name() -> String { "Ada" }
}
let g: Greeter = AdaGreeter()
print(g.greet())Saída:
Hello, AdaDesafio
FácilNotification tem um método render() que retorna [info] text. Declare as subclasses Warning, cujo render() retorna [warn] TEXT (o texto em letras maiúsculas), e Reminder, que adiciona um minutes armazenado e cujo render() retorna o resultado da superclasse seguido de (in 10 min), usando super.
O código fornecido lê linhas info,text, warn,text ou remind,text,10, cria o objeto apropriado em um array de Notification e imprime render() para cada um.
Seu código deve estar em Notification.swift, Warning.swift e Reminder.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 all: [Notification] = []
for line in input {
let p = line.split(separator: ",").map(String.init)
switch p[0] {
case "warn": all.append(Warning(text: p[1]))
case "remind":
let r = Reminder(text: p[1])
r.minutes = Int(p[2])!
all.append(r)
default: all.append(Notification(text: p[1]))
}
}
for n in all { print(n.render()) }
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