Menu
Coddy logo textTech

Sobrescritura de métodos

Parte de la sección Programación orientada a objetos del Journey de Swift de Coddy. Lección 23 de 57.

Una subclase puede reemplazar un método heredado con su propia versión. Se requiere la palabra clave override, lo que evita reemplazar un método por accidente:

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())

Salida:

Woof
Meow
...

super.method() llama a la versión de la superclase desde dentro de la sobrescritura, de modo que la subclase puede añadir comportamiento al comportamiento heredado en lugar de reemplazarlo por completo:

class Report {
    func text() -> String { "Sales: 120" }
}

class SignedReport: Report {
    override func text() -> String {
        super.text() + " (signed by Ada)"
    }
}

print(SignedReport().text())

Salida:

Sales: 120 (signed by Ada)

Las propiedades calculadas también se pueden sobrescribir con override var:

class Shape {
    var sides: Int { 0 }
    var summary: String { "\(sides) sides" }
}

class Triangle: Shape {
    override var sides: Int { 3 }
}

print(Triangle().summary)

Salida:

3 sides

La sobrescritura se ejecuta incluso cuando el método se llama desde código heredado: summary arriba está escrito en Shape, pero utiliza los sides de Triangle. Swift siempre llama a la versión del objeto real, que es lo que hace útil la sobrescritura:

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())

Salida:

Hello, Ada
challenge icon

Desafío

Fácil

Notification tiene un método render() que devuelve [info] text. Declara las subclases Warning, cuyo render() devuelve [warn] TEXT (el texto en mayúsculas), y Reminder, que añade un minutes almacenado y cuyo render() devuelve el resultado de la superclase seguido de (in 10 min), usando super.

El código proporcionado lee líneas info,text, warn,text o remind,text,10, construye el objeto correspondiente en un array de Notification e imprime render() para cada uno.

Tu código va en Notification.swift, Warning.swift y Reminder.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 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 iconPonte a prueba

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

Practica por tu cuenta: Playground de Swift