Menu
Coddy logo textTech

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 sides

A 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, Ada
challenge icon

Desafio

Fácil

Notification 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()) }
quiz iconTeste seus conhecimentos

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

Pratique por conta própria: Playground de Swift