Swift 从零开始 14_构造器的继承和重写

1.构造器的继承:

Swift的子类不会自动继承父类的构造器, 若继承, 则满足如下规则:

1.如果子类没有提供任何指定构造器, 那么它将自动继承父类的所有指定构造器

2.如果子类实现了父类所有的指定构造器, 无论如何实现的, 都将自动继承父类的所有便利构造器

2.构造器的重写:

1.子类构造器重写了父类的指定构造器, 必须添加override修饰符

2.子类中定义的构造器只是和父类中便利构造器的形参列表, 外部形参名相同, 不算重写

总结:

1.如果一个子类没有定义任何构造器, 那么它将自动继承父类中的所有构造器

2.如果一个子类重写父类的所有指定构造器, 那么它将自动继承父类中的所有便利构造器

3.如果一个子类中任意的构造器和父类的便利构造器一模一样, 不算重写, 创建对象的时候也只会显示子类定义的构造器

示例代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
class Person {
var name: String!
var weight: Double
init(name: String) {
self.name = name
self.weight = 0.0
}
// 定义指定构造器
init(name: String, weight: Double) {
self.name = name
self.weight = weight
}
// 定义便利构造器(使用convenience修饰)
convenience init(n name: String, w weight: Double) {
// 便利构造器必须调用同类中的指定构造器
self.init(name: name, weight: weight)
}
convenience init(showStr: String) {
self.init(name: "", weight: 0.0)
print(showStr)
}
}
class Man: Person {
var sex: String = "男"
override init(name: String) {
// 子类的指定构造器中必须调用父类的指定构造器
super.init(name: name)
self.name = name
self.weight = 0.0
}
override init(name: String, weight: Double) {
super.init(name: name, weight: weight)
self.name = name
self.weight = weight
}
// 定义指定构造器与父类的便利构造器一样, 这里不算重写
convenience init(showStr: String) {
self.init(name: "", weight: 0.0)
print(showStr)
}
}
var man = Man(name: "Rinpe", weight: 62.0)
var man1 = Man(showStr: "HelloWorld")