在 Swift 中进行子类化时理解 init()
Understanding init() when sub-classing in Swift
从已有初始化程序的 class 继承时如何添加自定义初始化程序?
我有一个 Vehicle
class,它有一个接受参数 name
的初始化器。我想要做的是从这个 Vehicle
class 继承,为新的 class 创建另一个初始化器,但继续使用现有的初始化器。
基础Class(这里没问题):
class Vehicle{
var make:String
init(make:String){
self.make = make
}
}
新 Class(不起作用):
// Not sure how to structure this class
class Car:Vehicle {
var engine:Double
override init(){
super.init()
}
init(engine:Double){
self.engine = engine
}
}
这就是我希望能够做的......重新使用现有的初始化程序和新的初始化程序。
let cobalt = Car(make:"Chevy" engine: 2.5)
子类中的任何指定初始值设定项都必须调用其直接超类中的指定初始值设定项:
Initializer Delegation for Class Types
To simplify the relationships between designated and convenience
initializers, Swift applies the following three rules for delegation
calls between initializers:
Rule 1 A designated initializer must call a designated initializer
from its immediate superclass
...
来自Swift Language Guide - Initialization.
因此,您可以构造 Car
的指定初始化程序以接受两个参数,make
和 engine
,并使用后者初始化成员 属性 engine
的子类,此后使用提供的 make
参数(提供给子类初始化器)作为超类初始化器的参数调用超类的指定初始化器。
class Car: Vehicle {
var engine: Double
init(make: String, engine:Double){
self.engine = engine
super.init(make: make)
}
}
从已有初始化程序的 class 继承时如何添加自定义初始化程序?
我有一个 Vehicle
class,它有一个接受参数 name
的初始化器。我想要做的是从这个 Vehicle
class 继承,为新的 class 创建另一个初始化器,但继续使用现有的初始化器。
基础Class(这里没问题):
class Vehicle{
var make:String
init(make:String){
self.make = make
}
}
新 Class(不起作用):
// Not sure how to structure this class
class Car:Vehicle {
var engine:Double
override init(){
super.init()
}
init(engine:Double){
self.engine = engine
}
}
这就是我希望能够做的......重新使用现有的初始化程序和新的初始化程序。
let cobalt = Car(make:"Chevy" engine: 2.5)
子类中的任何指定初始值设定项都必须调用其直接超类中的指定初始值设定项:
Initializer Delegation for Class Types
To simplify the relationships between designated and convenience initializers, Swift applies the following three rules for delegation calls between initializers:
Rule 1 A designated initializer must call a designated initializer from its immediate superclass
...
来自Swift Language Guide - Initialization.
因此,您可以构造 Car
的指定初始化程序以接受两个参数,make
和 engine
,并使用后者初始化成员 属性 engine
的子类,此后使用提供的 make
参数(提供给子类初始化器)作为超类初始化器的参数调用超类的指定初始化器。
class Car: Vehicle {
var engine: Double
init(make: String, engine:Double){
self.engine = engine
super.init(make: make)
}
}