Sobrescritura de Métodos y Propiedades en Clases Derivadas

Clase 17 de 27Curso de Programación Orientada a Objetos en Swift

Resumen

¿Qué es la sobreescritura en programación orientada a objetos?

La sobreescritura es uno de los conceptos fundamentales en la programación orientada a objetos. Permite que una subclase pueda proporcionar su propia implementación de un método o propiedad que ya existe en una clase padre. En esencia, la sobreescritura le da a la subclase la habilidad de definir un comportamiento específico que reemplaza al de la superclase.

¿Cómo sobreescribir métodos y propiedades en Python?

Sobreescribir métodos y propiedades implica redefinirlos en una subclase para que esta utilice su propia versión, sin importar la implementación de su clase superior.

class Vehiculo:
    def haz_ruido(self):
        pass

class Tren(Vehiculo):
    def haz_ruido(self):
        print("Chucho Chucho")

tren = Tren()
tren.haz_ruido()  # Salida: Chucho Chucho

En este ejemplo, Tren hereda de Vehiculo y sobreescribe el método haz_ruido.

¿Cómo se utiliza super() para extender la funcionalidad?

El uso de super() permite invocar métodos de la clase padre, facilitando la extensión de funcionalidades sin sobreescribir completamente la implementación existente.

class Coche(Vehiculo):
    def __init__(self, velocidad):
        self.velocidad = velocidad

    def descripcion(self):
        return f'Viajando a {self.velocidad} km/h'

class CocheAutomatico(Coche):
    def descripcion(self):
        return super().descripcion() + ' en modo automático'

coche = CocheAutomatico(100)
print(coche.descripcion())  # Salida: Viajando a 100 km/h en modo automático

Aquí, CocheAutomatico extiende el método descripcion de Coche.

¿Qué es la palabra clave final y para qué se utiliza?

final es un modificador que indica que un método o una propiedad no deben ser sobreescritos más abajo en la jerarquía de herencia. Esto garantiza que ninguna subclase pueda alterar una implementación esencial de su clase base.

from typing import final

class Vehiculo:
    @final
    def tipo_vehiculo(self):
        return 'Vehículo'

class Coche(Vehiculo):
    # Intentar sobreescribir el método tipo_vehiculo resultará en un error.
    pass

En este caso, aplicar @final asegura que tipo_vehiculo no pueda ser modificado en Coche.

¿Cuándo usar la sobreescritura y la relación con otras clases?

La sobreescritura es clave cuando se necesita adaptar o personalizar el comportamiento de un método o propiedad en una subclase. Por ejemplo, una subclase de Vehiculo puede ser un Coche, y otro puede ser un Tren. Cada tipo de vehículo hace ruido de manera distinta, pero comparten el mismo método haz_ruido.

Ejercicio propuesto

Implementa el método haz_ruido en una subclase Bicicleta. ¿Crees que el ruido del Tándem será igual al de Bicicleta o necesitará su propia implementación? Explora la posibilidad de sobreescribir o no según tu juicio.

Recuerda, mientras más practiques con herencia y sobreescritura en tus proyectos, más cómodo te sentirás modelando problemas del mundo real en código. ¡Continúa desarrollando tus habilidades!