Sobrescritura de Métodos y Propiedades en Clases Derivadas
Clase 17 de 27 • Curso de Programación Orientada a Objetos en Swift
Contenido del curso
Tipos de Propiedades
- 5

Propiedades Almacenadas en Swift: Uso y Ejemplos Prácticos
04:48 min - 6

Propiedades Lazy en Programación: Uso y Ventajas
07:16 min - 7

Propiedades Computadas en Swift: Uso y Ejemplos Prácticos
10:30 min - 8

Computed properties de solo lectura en Swift
05:14 min - 9

Observers en Swift: willSet y didSet
07:18 min - 10

Variables estáticas en clases, estructuras y enumerados
09:19 min
Métodos, subíndices y herencia
- 11

Métodos de instancia en Swift con self
07:35 min - 12

Métodos Mutantes en Estructuras y Enumerados en Swift
09:05 min - 13

Métodos de clase en Swift: static vs class
10:50 min - 14

Subíndices en Swift: Sintaxis y Aplicaciones Prácticas
09:01 min - 15

Manipulación de Matrices y Subíndices en Programación
12:27 min - 16

Herencia de Clases en Programación Orientada a Objetos
10:14 min - 17

Sobrescritura de Métodos y Propiedades en Clases Derivadas
Viendo ahora
Inicializadores o constructores
- 18

Inicializadores en Sweet: Creación y Uso Efectivo de Constructores
06:50 min - 19

Modificación de Constructores y Parámetros Opcionales en Swift
10:10 min - 20

Constructores Designados y de Conveniencia en Herencia de Clases
09:37 min - 21

Constructores y manejo de inicialización opcional en Swift
08:42 min - 22

Destructores en Programación: Liberación de Recursos Automática
07:12 min
Encadenamiento opcional
Conclusión
Domina la herencia en Swift con ejemplos claros: aprende a sobrescribir métodos y propiedades con override, a combinar resultados con super, a usar observers como didSet para lógica reactiva y a proteger APIs con final para evitar cambios en subclases. Todo con el caso de Vehicle, Train, Car y AutomaticCar.
¿Cómo funciona la sobrescritura en Swift?
Sobrescribir en Swift implica redefinir en la subclase lo que la clase padre ya tiene. Con la palabra reservada override indicas que tu implementación reemplaza la del padre y será la que se ejecute.
- Usa override en métodos y propiedades computadas.
- Lo del padre no se ejecuta, a menos que invoques super.
- Si la subclase no implementa override, hereda el comportamiento del padre.
¿Qué cambia al sobrescribir métodos como makeNoise?
En el ejemplo, el tren redefine el sonido con override. Así el método del hijo se ejecuta en lugar del del padre.
class Vehicle {
var currentSpeed: Double = 0.0
var description: String { "Viajando a \(currentSpeed) kilómetros por hora" }
func makeNoise() { print("El ruido depende del vehículo") }
}
class Train: Vehicle {
override func makeNoise() {
print("chu, chu")
}
}
let train = Train()
train.makeNoise() // chu, chu
- Idea clave: override sustituye la implementación del padre.
- Si otra subclase, como Tandem, no hace override, ejecuta la del padre: "El ruido depende del vehículo".
¿Qué sucede si no hay override en la subclase?
- El método del padre se utiliza sin cambios.
- Útil cuando varias subclases comparten el mismo comportamiento base.
- Puedes decidir si una subclase reutiliza al padre o añade su propia lógica.
¿Cómo sobrescribir properties, getters/setters y observers?
Además de métodos, puedes sobrescribir propiedades computadas y sus getters/setters, e incluso observers como didSet, para ajustar la lógica cuando cambia el estado.
¿Cómo combinar super.description con información extra?
El coche añade una propiedad gear y enriquece la descripción usando super.description.
class Car: Vehicle {
var gear: Int = 1
override var description: String {
return super.description + " en la marcha \(gear)"
}
}
let car = Car()
car.currentSpeed = 55
car.gear = 3
print(car.description) // Viajando a 55 kilómetros por hora en la marcha 3
- Patrón común: toma lo del padre con super y agrega contexto propio.
- Mantiene coherencia y evita duplicar lógica.
¿Cómo ajustar gear automáticamente con didSet?
El coche automático calcula la marcha en función de la velocidad con un observer.
class AutomaticCar: Car {
override var currentSpeed: Double {
didSet {
gear = Int(currentSpeed / 15.0) + 1
}
}
}
let automatic = AutomaticCar()
automatic.currentSpeed = 35
print(automatic.description) // ... en la marcha 3
automatic.currentSpeed = 55
print(automatic.description) // ... en la marcha 4
automatic.currentSpeed = 65
print(automatic.description) // ... en la marcha 5
- Lógica reactiva: didSet responde a cambios en tiempo real.
- Fórmula simple y legible: velocidad/15.0 más 1.
¿Cómo evitar que una subclase sobrescriba con final?
Cuando no quieres que una API cambie en herencias, marca métodos o propiedades como final. Así, ninguna subclase podrá sobrescribirlos.
¿Qué implica marcar una property como final?
Si el tren fija un dato que no debe cambiar en subclases, usa final.
class Train: Vehicle {
final var numberOfWagons: Int = 0
override func makeNoise() { print("chu, chu") }
}
class Railway: Train {
// override var numberOfWagons: Int = 10
// Error: property does not override any property from its superclass
}
- Protección de diseño: final impide cambios indeseados en herencia.
- Aplica a métodos, propiedades, subscripts y también a métodos estáticos declarados con class.
¿Te gustaría ver más variantes con Bicycle o Tandem y decidir cuándo usar el del padre o su propio override? Cuéntame en comentarios qué implementarías y por qué.