重写实例属性
我们可以在子类中重写从父类继承来的属性,属性有实例属性和静态属性之分,他们在具体实现也是不同的。
实例属性的重写一方面可以重写getter和setter访问器,另一方面可以重写属性观察者。
计算静态属性需要使用getter和setter访问器,而存储属性不需要。子类在继承父类后,也可以通过getter和setter访问器重写父类的存储属性和计算属性。
下面看一个示例:
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
|
class
Person {
var name: String
//存储属性
var age: Int
//存储属性
func description() -> String{
return
"\(name) 年龄是: \(age)"
}
init (name: String, age: Int){
self.name = name
self.age = age
}
}
class
Student: Person{
var school: String
override var age: Int {
//重写属性前面要添加override关键字
get {
return
super
.age
}
set {
super
.age = newValue <
8
?
8
: newValue
}
}
convenience init() {
self.init(name:
"Tony"
, age:
18
, school:
"清华大学"
)
}
init (name: String, age: Int,school: String) {
self.school = school
super
.init(name: name, age: age)
}
}
let student1 = Student()
print(
"学生年龄:\(student1.age)"
)
student1.age =
6
print(
"学生年龄:\(student1.age)"
)
|
从属性重写可见,子类本身并不存储数据,数据是存储在父类的存储属性中的。
以上示例是重写属性getter和setter访问器,我们还可以重写属性观察者,代码如下:
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
|
class
Person {
var name: String
var age: Int
func description() -> String{
return
"\(name) 年龄是: \(age)"
}
init (name: String, age: Int){
self.name = name
self.age = age
}
}
class
Student: Person{
var school: String
override var age: Int {
//重写了age属性观察者
willSet {
//如果只关注修改之前的调用,可以只重写willSet观察者
print(
"学生年龄新值:\(newValue)"
)
}
didSet{
//如果只关注修改之后的调用,可以只重写didSet观察者
print(
"学生年龄旧值:\(oldValue)"
)
}
}
convenience init() {
self.init(name:
"Tony"
, age:
18
, school:
"清华大学"
)
}
init (name: String, age: Int,school: String) {
self.school = school
super
.init(name: name, age: age)
}
}
let student1 = Student()
print(
"学生年龄:\(student1.age)"
)
Student1.age =
6
print(
"学生年龄:\(student1.age)"
)
|
代码Student1.age = 6修改了age属性,修改前后的输出结果如下:
学生年龄新值:6
学生年龄旧值:18
重写静态属性
在类中静态属性定义使用class或static关键字,但是使用哪一个要看子类中是否重写该属性。class修饰的属性可以被重写,static关键字就不能被重写。
示例代码如下:
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
|
class
Account {
var amount: Double =
0.0
// 账户金额
var owner: String =
""
//账户名
var interestRate: Double =
0.0668
//利率
//class不能换成static
class
var staticProp: Double {
//静态属性staticProp
return
0.0668
* 1_000_000
}
var instanceProp: Double {
return
self.interestRate *self.amount
}
}
class
TermAccount: Account {
//class换成static
override
class
var staticProp: Double {
//重写静态属性staticProp
return
0.0700
* 1_000_000
}
}
//访问静态属性
print(Account.staticProp)
print(TermAccount.staticProp)
|
由于要被重写所以代码class var staticProp: Double 中的class不能换成static。代码overrideclass var staticProp: Double中的静态属性staticProp可以使用class或static,除非在TermAccount的子类中重写属性staticProp。
本文转自 tony关东升 51CTO博客,原文链接:http://blog.51cto.com/tonyguan/1747501,如需转载请自行联系原作者