[Swift] Reglas de herencia para el inicio del constructor

Resumir:

1. La subclase no personaliza el constructor designado -> [heredar todos los constructores de la clase principal, incluidos los constructores designados y de conveniencia]

2. La subclase personaliza el constructor designado y sobrecarga el constructor designado de la clase principal [solo hereda el constructor de conveniencia de la clase principal]

3. El constructor designado personalizado de la subclase no sobrecarga el constructor designado de la clase principal [no hereda ningún constructor de la clase principal]

 

Herencia automática de constructores

Como se mencionó anteriormente, las subclases no heredan los constructores de superclases de forma predeterminada. Pero si se cumplen ciertas condiciones, el constructor de la clase principal se puede heredar automáticamente. De hecho, esto significa que no es necesario anular el constructor de la superclase en muchos escenarios comunes y puede heredar el constructor de la superclase con un costo mínimo cuando sea seguro.

Suponiendo que proporcione valores predeterminados para todas las propiedades nuevas introducidas en las subclases, se aplicarán las siguientes dos reglas:

regla 1

Si la subclase no define ningún inicializador designado, heredará automáticamente todos los inicializadores designados de la clase principal.

Regla 2

Si la subclase proporciona implementaciones de todos los inicializadores designados de la superclase (ya sea heredados mediante la regla 1 o proporciona una implementación personalizada), heredará automáticamente todos los inicializadores de conveniencia de la superclase.

Estas dos reglas aún se aplican incluso si agrega más inicializadores de conveniencia a sus subclases.

Aviso

Las subclases pueden implementar la regla 2 implementando el inicializador designado de la superclase como un inicializador de conveniencia.

Basado en la referencia oficial del caso:

class Food {
    var name: String
    init(name: String) {
        self.name = name
    }
    
    convenience init(type:String) {
        self.init(name: "[Unnamed]")
    }
}

class RecipeIngredient: Food {
    var quantity: Int
    init(name: String, quantity: Int) {
        self.quantity = quantity
        super.init(name: name)
    }
    override convenience init(name: String) {
        /*
            1、重载了父类的指定构造器且使用了便利构造器的方式
            2、满足了【重载父类指定构造器】的条件,则自动继承父类全部便利构造器!
         */
        self.init(name: name, quantity: 1)
    }
}

class ShoppingListItem: RecipeIngredient {
    /*
        1、子类没有定义任何指定构造器,它将自动继承父类所有的指定构造器。
     */
    var purchased = false
    var description: String {
        var output = "\(quantity) x \(name)"
        output += purchased ? " ✔" : " ✘"
        return output
    }
}

Supongo que te gusta

Origin blog.csdn.net/weixin_43343144/article/details/130283409
Recomendado
Clasificación