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 sidesLa 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, AdaDesafío
FácilNotification 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()) }
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