Tutorial Swift - Herencia en Swift (Aprende a programar apps para iOS)
Tutorial Swift - Herencia en Swift (Aprende a programar apps para iOS)

HERENCIA en Swift en Español - Curso Swift | Tutorial Swift

Herencia en Swift. En la programación orientada a objetos es muy común la herencia. Crear subclases a partir de una clase común y dar un comportamiento distintos a cada una de ellas.

SwiftBeta

Tabla de contenido


👇 SÍGUEME PARA APRENDER SWIFTUI, SWIFT, XCODE, etc 👇
Herencia en Swift

Una clase puede heredar métodos, propiedades de otra clase o subscripts (esto aún no lo hemos visto, lo veremos más adelante). Cuando una clase hereda de otra, la que hereda se la llama subclase y de la clase de la que hereda se la llama superclase.

Si has trabajado con programación orientada a objetos (OOP) ya debes saber de lo que hablo.

Cuando heredamos de una clase podemos sobrescribir sus métodos y propiedades. También podemos añadir property observers en las propiedades heredadas para "escuchar" cuando el valor de la propiedad cambia.

Definiendo una clase base

Cualquier clase que no hereda de ninguna otra la podemos llamar clase base. Vamos a ver un ejemplo, crearemos una clase Vehicle, que será nuestra clase base y a partir de ahí otras clases heredaran de ella:

class Vehicle {
    var currentSpeed = 0.0
    
    var description: String {
        return "traveling at \(currentSpeed) miles per hour"
    }
    
    func makeNoise() {
        // do nothing
    }
}

Al tener la clase Vehicle, podemos crear una instancia y ver que valor nos imprime en consola la propiedad description

let someVehicle = Vehicle()
someVehicle.description

// El resultado es "traveling at 0.0 miles per hour"

La clase Vehicle define características comunes para un vehículo arbitrario, pero no es de mucha utilidad en sí misma. Para hacerla más útil, tenemos que crear tipos de vehículos más específicos. Para ello vamos a crear subsclases.


Subclase

Al crear una subclase, cogemos el comportamiento por defecto de la clase base y lo modificamos. ¿Cómo lo modificamos? Sobrescribiendo métodos, propiedades, creando métodos o propiedades nuevas, etc.

class Bicycle: Vehicle {
    var hasBasket = false
}

En el código anterior, hemos creado una clase Bicycle que hereda de Vehicle. Es decir, con una instancia de Bicycle podemos usar todos los métodos que existen en la base class y modificar la variable hasBasket.

let bicycle = Bicycle()
bicycle.hasBasket = true
bicycle.currentSpeed = 15.0

bicycle.description

// El resultado es "traveling at 15.0 miles per hour"

Ahora podríamos hacer lo mismo, y crear más tipos de bicicletas.


Sobrescribir

Una subclase puede proporcionar su propia implementación de una instancia de método, método de tipo, propiedad de instancia, propiedad de tipo, etc. A esto lo llamamos sobrescribir.

Para crear una implementación específica en una subclase, solo tenemos que crear el método de la superclase y antes de la keyword func añadir override.

Sobrescribir métodos

class Train: Vehicle {
    override func makeNoise() {
        print("Choo Choo")
    }
}

let train = Train()
train.makeNoise()

// El resultado es "Choo Choo"

Sobrescribir propiedades

class Car: Vehicle {
    var gear = 1
    override var description: String {
        return super.description + " in gear \(gear)"
    }
}

let car = Car()
car.currentSpeed = 25.0
car.gear = 3
print("Car: \(car.description)")

// El resultado es "Car: traveling at 25.0 miles per hour in gear 3\n"

¿Cómo impedir sobrescribir?

Podemos prevenir que se sobrescriban los métodos, propiedades, etc de una super clase. Para ello debemos poner el modificador final delante de la variable, método, método de tipo, etc.

final var
final func
final class func

Cualquier intento de sobrescribir un método o propiedad con final dará un error en tiempo de compilación.

También podemos marcar una clase como final, para indicarle al compilador que esa clase no puede tener subclases. Cualquier intento de crear subclases daría un error en tiempo de compilación.