继承
This commit is contained in:
@@ -1,3 +1,72 @@
|
||||
import UIKit
|
||||
|
||||
var greeting = "Hello, playground"
|
||||
//class Animal {
|
||||
// func speak() {
|
||||
// print("Animal speak")
|
||||
// }
|
||||
// subscript(index: Int) -> Int {
|
||||
// return index
|
||||
// }
|
||||
//}
|
||||
//
|
||||
//var anim: Animal
|
||||
//anim = Animal()
|
||||
//anim.speak()
|
||||
//print(anim[6])
|
||||
//
|
||||
//class Cat: Animal {
|
||||
// override func speak() {
|
||||
// print("Cat speak")
|
||||
// }
|
||||
//
|
||||
// override subscript(index: Int) -> Int {
|
||||
// return super[index] + 1
|
||||
// }
|
||||
//}
|
||||
//
|
||||
//var cat = Cat()
|
||||
//cat.speak()
|
||||
//print(cat[6])
|
||||
|
||||
class Animal {
|
||||
class func speak() {
|
||||
print("Animal speak")
|
||||
}
|
||||
static subscript(index: Int) -> Int {
|
||||
return index
|
||||
}
|
||||
}
|
||||
|
||||
class Cat: Animal {
|
||||
override class func speak() {
|
||||
super.speak()
|
||||
print("Cat speak")
|
||||
}
|
||||
}
|
||||
|
||||
class Circle {
|
||||
static var radius: Int = 0
|
||||
class var diameter: Int {
|
||||
set {
|
||||
print("Circle setDiameter")
|
||||
radius = newValue / 2
|
||||
}
|
||||
get {
|
||||
print("Circle getDiameter")
|
||||
return radius * 2
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class SubCircle: Circle {
|
||||
override class var diameter: Int {
|
||||
set {
|
||||
print("SubCircle setDiameter")
|
||||
super.diameter = newValue > 0 ? newValue : 0
|
||||
}
|
||||
get {
|
||||
print("SubCircle getDiameter")
|
||||
return super.diameter
|
||||
}
|
||||
}
|
||||
}
|
||||
|
225
13 继承.playground/Resources/README.md
Normal file
225
13 继承.playground/Resources/README.md
Normal file
@@ -0,0 +1,225 @@
|
||||
### 继承(Inheritance)
|
||||
|
||||
值类型(枚举、结构体)不支持继承,只有类支持继承。
|
||||
|
||||
* 没有父类的类称为基类
|
||||
* 子类可以重写父类的**下标**、**方法**、**属性**,重写必须加上 `override` 关键字
|
||||
|
||||
#### 重写实例方法、下标
|
||||
|
||||
```swift
|
||||
class Animal {
|
||||
func speak() {
|
||||
print("Animal speak")
|
||||
}
|
||||
subscript(index: Int) -> Int {
|
||||
return index
|
||||
}
|
||||
}
|
||||
|
||||
var anim: Animal
|
||||
anim = Animal()
|
||||
// Animal speak
|
||||
anim.speak()
|
||||
// 6
|
||||
print(anim[6])
|
||||
|
||||
class Cat: Animal {
|
||||
override func speak() {
|
||||
super.speak()
|
||||
print("Cat speak")
|
||||
}
|
||||
|
||||
override subscript(index: Int) -> Int {
|
||||
return super[index] + 1
|
||||
}
|
||||
}
|
||||
|
||||
var cat = Cat()
|
||||
// Animal speak
|
||||
// Cat speak
|
||||
cat.speak()
|
||||
// 7
|
||||
print(cat[6])
|
||||
```
|
||||
|
||||
#### 重写类型方法、下标
|
||||
|
||||
* 被 `class` 修饰的类型方法、下标,允许被子类重写
|
||||
* 被 `static` 修饰的类型方法、下标,不允许被子类重写
|
||||
|
||||
```swift
|
||||
class Animal {
|
||||
// class 修饰的方法可以子类被重写
|
||||
class func speak() {
|
||||
print("Animal speak")
|
||||
}
|
||||
// static 修饰的方法不可以子类被重写
|
||||
static subscript(index: Int) -> Int {
|
||||
return index
|
||||
}
|
||||
}
|
||||
|
||||
class Cat: Animal {
|
||||
override class func speak() {
|
||||
super.speak()
|
||||
print("Cat speak")
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 重写属性
|
||||
|
||||
1. 子类可以将父类的属性(存储、计算)重写为 **计算属性**。
|
||||
2. 子类不可以将父类属性重写为 **存储属性**
|
||||
3. 只能重写 `var` 属性,不能重写 `let` 属性
|
||||
4. 重写时,属性名、类型要一致
|
||||
5. 子类重写后的属性权限 **不能小于** 父类属性的权限
|
||||
1. 如果父类属性是只读,那么子类重写后的属性可以是只读的,也可以是可读写的
|
||||
2. 如果父类是可读写的,那么子类重写后的属性也必须是可读写的
|
||||
|
||||
##### 重写实例属性
|
||||
|
||||
```swift
|
||||
class SubCircle : Circle {
|
||||
override var radius: Int {
|
||||
set {
|
||||
print("SubCircle setRadius")
|
||||
super.radius = newValue > 0 ? newValue : 0
|
||||
}
|
||||
get {
|
||||
print("SubCircle getRadius")
|
||||
return super.radius
|
||||
}
|
||||
}
|
||||
override var diameter: Int {
|
||||
set {
|
||||
print("SubCircle setDiameter")
|
||||
super.diameter = newValue > 0 ? newValue : 0
|
||||
}
|
||||
get {
|
||||
print("SubCircle getDiameter")
|
||||
return super.diameter
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
circle = SubCircle()
|
||||
// SubCircle setRadius
|
||||
circle.radius = 6
|
||||
// SubCircle getDiameter
|
||||
// Circle getDiameter
|
||||
// SubCircle getRadius
|
||||
// 12
|
||||
print(circle.diameter)
|
||||
// SubCircle setDiameter
|
||||
// Circle setDiameter
|
||||
// SubCircle setRadius
|
||||
circle.diameter = 20
|
||||
// SubCircle getRadius
|
||||
// 10
|
||||
print(circle.radius)
|
||||
```
|
||||
|
||||
##### 重写类型属性
|
||||
|
||||
1. 被 `class` 修饰的计算类型属性,可以被子类重写
|
||||
|
||||
2. 被 `static` 修饰的类型属性(存储、计算),不可以被子类重写
|
||||
|
||||
```swift
|
||||
class Circle {
|
||||
static var radius: Int = 0
|
||||
class var diameter: Int {
|
||||
set {
|
||||
print("Circle setDiameter")
|
||||
radius = newValue / 2
|
||||
}
|
||||
get {
|
||||
print("Circle getDiameter")
|
||||
return radius * 2
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class SubCircle: Circle {
|
||||
override class var diameter: Int {
|
||||
set {
|
||||
print("SubCircle setDiameter")
|
||||
super.diameter = newValue > 0 ? newValue : 0
|
||||
}
|
||||
get {
|
||||
print("SubCircle getDiameter")
|
||||
return super.diameter
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### 属性观察器
|
||||
|
||||
可以在子类中为父类属性(除了只读计算属性、let属性)增加属性观察器
|
||||
|
||||
```swift
|
||||
class Circle {
|
||||
// 父类是存储属性
|
||||
var radius: Int = 1
|
||||
}
|
||||
|
||||
class SubCircle : Circle {
|
||||
override var radius: Int {
|
||||
willSet {
|
||||
print("SubCircle willSetRadius", newValue)
|
||||
}
|
||||
didSet {
|
||||
print("SubCircle didSetRadius", oldValue, radius)
|
||||
}
|
||||
}
|
||||
}
|
||||
var circle = SubCircle()
|
||||
// SubCircle willSetRadius 10
|
||||
// SubCircle didSetRadius 1 10
|
||||
circle.radius = 10
|
||||
```
|
||||
|
||||
```swift
|
||||
class Circle {
|
||||
// 父类存储属性也有属性观察器
|
||||
var radius: Int = 1 {
|
||||
willSet {
|
||||
print("Circle willSetRadius", newValue)
|
||||
}
|
||||
didSet {
|
||||
print("Circle didSetRadius", oldValue, radius)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class SubCircle : Circle {
|
||||
override var radius: Int {
|
||||
willSet {
|
||||
print("SubCircle willSetRadius", newValue)
|
||||
}
|
||||
didSet {
|
||||
print("SubCircle didSetRadius", oldValue, radius)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var circle = SubCircle()
|
||||
// SubCircle willSetRadius 10
|
||||
// Circle willSetRadius 10
|
||||
// Circle didSetRadius 1 10
|
||||
// SubCircle didSetRadius 1 10
|
||||
circle.radius = 10
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### final
|
||||
|
||||
被 `final` 修饰的方法、下标、属性,禁止被重写
|
||||
|
||||
被 `final` 修饰的类,禁止被继承
|
@@ -1,4 +1,4 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<playground version='5.0' target-platform='ios' buildActiveScheme='true' executeOnSourceChanges='false' importAppTypes='true'>
|
||||
<playground version='5.0' target-platform='ios' buildActiveScheme='true' importAppTypes='true'>
|
||||
<timeline fileName='timeline.xctimeline'/>
|
||||
</playground>
|
Binary file not shown.
@@ -1,6 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Timeline
|
||||
version = "3.0">
|
||||
<TimelineItems>
|
||||
</TimelineItems>
|
||||
</Timeline>
|
@@ -1,16 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>SchemeUserState</key>
|
||||
<dict>
|
||||
<key>13 继承 (Playground).xcscheme</key>
|
||||
<dict>
|
||||
<key>isShown</key>
|
||||
<false/>
|
||||
<key>orderHint</key>
|
||||
<integer>0</integer>
|
||||
</dict>
|
||||
</dict>
|
||||
</dict>
|
||||
</plist>
|
Reference in New Issue
Block a user