在Swift中进行子类化时了解init()

fs_*_*gre 0 inheritance subclass init swift

从已经具有初始化程序的类继承时,如何添加自定义初始值设定项?

我所拥有的是一个Vehicle有一个参与的itializer 的类name.我想要做的是继承这个Vehicle类,为新类创建另一个初始化器,但继续使用现有的初始化器.

基类(这里没问题):

class Vehicle{
    var make:String
    init(make:String){
     self.make = make
    }
}
Run Code Online (Sandbox Code Playgroud)

新类(不起作用):

// Not sure how to structure this class     
class Car:Vehicle {
    var engine:Double

    override init(){
        super.init()
    }

    init(engine:Double){
        self.engine = engine
    }
}
Run Code Online (Sandbox Code Playgroud) 这就是我希望能够做到的...重新使用现有的初始化程序和新的初始化程序.
let cobalt = Car(make:"Chevy" engine: 2.5)
Run Code Online (Sandbox Code Playgroud)

dfr*_*fri 5

子类中的任何指定初始值设定项都必须从其直接超类中调用指定的初始值设定项:

类类型的初始化程序委派

为了简化指定和便利初始化程序之间的关系,Swift对初始化程序之间的委托调用应用以下三个规则:

规则1指定的初始化程序必须从其直接超类中调用指定的初始化程序

...

来自Swift语言指南 - 初始化.

因此,你可以构造你的指定初始化器Car来获取两个参数,make然后engine使用后者来engine初始化子类的成员属性,然后使用提供的make参数(提供给子类初始化器)作为参数调用超类的指定初始化器.超类初始化器.

class Car: Vehicle {
    var engine: Double

    init(make: String, engine:Double){
        self.engine = engine
        super.init(make: make)
    }
}
Run Code Online (Sandbox Code Playgroud)

  • `Vehicle`没有匹配`init(make:String,engine:Double)`的声明,所以你没有覆盖任何东西.当子类的声明与父类的声明匹配时,您只使用`override`,以通知编译器您知道您实际上正在覆盖现有声明. (2认同)