Aún no tienes acceso a esta clase

Crea una cuenta y continúa viendo este curso

Inicializadores en subclases

20/27
Recursos

Aportes 6

Preguntas 0

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesión.

Algo que falto mencionar es que cuando se hereda de una clase padre, y se intenta modificar el valor de una propiedad en la clase hijo por medio de una inicializador por conveniencia primer se tiene que llenar las propiedades pasadas a dicho inicializador, despues llamar al super.init() y despues modificar el valor en cuestion.

lo mismo aplica si no es un inicializador por conveniencia

/* check initializers*/
class Father{
    var name:String
    init(){
        self.name="Alfredo"
    }
}


class Children: Father{
    var lastName:String
    init(_ lastName:String){
        self.lastName = lastName
        super.init()
        self.name = self.name+"G.G"
    }
    
}


let a = Children("Gonzalez")
print(a.name)

Para los inicializadores con herencia, se deben cumplir las siguientes condiciones de manera obligatoria:

  1. Un inicializador designado llama a un designado de la super clase (implícita o explícitamente)
  2. Un inicializador por conveniencia solo puede llamar a otro de la misma clase
  3. El último init que se llame siempre debe ser designado

Tomando en cuenta lo que menciona @Alfredo Gonzales:

Si quieres tomar la propiedad de numberOfWheels para la clase hija (Hoverboard) deberás llamar explicitamente al super.init() de la clase padre y así hacerla propia para esta subclase (no la sobreescribes)

// Designated inits and for convenience
class Vehicle {
    var numberOfWheels = 0
    var description: String {
        return "\(numberOfWheels) wheels"
    }
}

let vehicle = Vehicle()
vehicle.description

class Bicycle: Vehicle {
    override init() {
        super.init()
        numberOfWheels = 2
    }
}

let bicycle = Bicycle()
bicycle.description

class Hoverboard: Vehicle {
    var color: String
    
    // Convenience
    init(color: String) {
        self.color = color
        super.init()
        numberOfWheels = 5
        // Implicit call to super.init
    }
    
    override var description: String {
        return "\(super.description) in the color \(self.color)"
    }
}

let hoverboard = Hoverboard(color: "Silver")
hoverboard.description

les comparto mi código jugando un poco con los inicializadores

class Vehicle{
    var numberOfWeels = 0
    var description: String{
        return "numero de ruedas: \(numberOfWeels)"
    }
}

class Bicycle: Vehicle{
    var color: String
    var tipo: String
        
    init(color: String, tipo: String) {
        self.color = color
        self.tipo = tipo
        //se llama por defecto super.init()
    }
    override var description: String{
        return "Bicycleta color: \(self.color) de tipo: \(self.tipo) numero de ruedas: \(super.numberOfWeels)"
    }
}
    




let bicycle = Bicycle(color: "morado", tipo: "normal")

bicycle.numberOfWeels
bicycle.color
print(bicycle.description)

Increible Clase!!!

y que pasa si declaro un inicializador por conveniencia en la clase padre?