类的继承和构造过程
Swift 提供指定构造器、便利构造器
两种类型的类构造器来确保所有类实例中存储型属性都能获得初始值
指定构造器 | 便利构造器 |
---|---|
类中最主要的构造器 | 类中比较次要的、辅助型的构造器 |
初始化类中提供的所有属性,并根据父类链往上调用父类的构造器来实现父类的初始化 | 可以定义便利构造器来调用同一个类中的指定构造器,并为其参数提供默认值。也可以定义便利构造器来创建一个特殊用途或特定输入的实例 |
每一个类都必须拥有至少一个指定构造器 | 只在必要的时候为类提供便利构造器 |
Init(parameters) { statements } |
convenience init(parameters) { statements } |
指定构造器
class mainClass {
var numA:Int
//指定构造器 实例
init(numA:Int){
self.numA = numA
}
}
class subClass:mainClass {
var numB:Int
init(numA:Int,numB:Int){
self.numB = numB
//调用父类的构造器来实现父类的初始化
super.init(numA: numA)
}
}
调用
let main = mainClass(numA: 12)
let sub = subClass(numA: 15, numB: 16)
print("main 值为:\(main.numA)")
print("sub值为:numA=\(sub.numA) numB=\(sub.numB)")
调用结果
main 值为:12
sub值为:numA=15 numB=16
便利构造器
class mainClass {
var numA:Int
init(numA:Int){
self.numA = numA
}
}
class subClass:mainClass {
var numB:Int
init(numA:Int,numB:Int){
self.numB = numB
super.init(numA: numA)
}
// 便利方法只需要一个参数
override convenience init(numA: Int) {
self.init(numA: numA, numB: 5)
}
}
调用
let main = mainClass(numA: 18)
let sub = subClass(numA: 10, numB: 16)
//调用便利构造器
let suba = subClass(numA: 3)
print("main 值为:\(main.numA)")
print("sub值为:numA=\(sub.numA) numB=\(sub.numB)")
print("suba值为:numA=\(suba.numA) numB=\(suba.numB)")
调用结果
main 值为:18
sub值为:numA=10 numB=16
suba值为:numA=3 numB=5
构造器的继承和重载
Swift中子类不会默认继承父类的构造器
父类构造器仅在确定和安全的情况下被继承
重写父类指定构造器时,需要用override
修饰符
//构造器的继承和重载
func constructorInheritFunc(){
class SuperClass {
var corners = 4
var description:String {
return "有\(corners)条边"
}
}
class SubClass:SuperClass {
override init() {//重写构造器
super.init()
corners = 5
}
}
}
调用
let rectangle = SuperClass()
print("矩形:\(rectangle.description)")
let subClass = SubClass()
print("五角形:\(subClass.description)")
调用结果
矩形:有4条边
五角形:有5条边
指定构造器和便利构造器
//指定构造器和便利构造器实例
func convenienceFunc() {
class MainClass {
var name:String
//父类的指定构造器
init(name:String){
self.name = name
}
//遍历构造器
convenience init(){
self.init(name: "【匿名】")
}
}
//调用指定构造器
let mainA = MainClass(name: "swift5.0")
print("mainA 的名字是:\(mainA.name)")
//直接调用遍历构造器
let mainB = MainClass()
print("mainB没有对应名字吗:\(mainB.name)")
class SubClass:MainClass {
var count:Int
init(name: String,count:Int) {
self.count = count;
//调用父类指定构造器
super.init(name: name)
}
//override修饰重写父类的指定构造器
override convenience init(name: String) {
//代理给子类的init(name: String,count:Int)构造器
self.init(name: name, count: 1)
}
}
let subA = SubClass(name: "swift5.0")
print("subA的名字为:\(subA.name)变量值:\(subA.count)")
let subB = SubClass(name: "my_swift5.0", count: 5)
print("subB.count变量是啥:\(subB.count)")
}
调用结果
mainA 的名字是:swift5.0
mainB没有对应名字吗:【匿名】
subA的名字为:swift5.0变量值:1
subB.count变量是啥:5