继承(Inheritance)
-
值类型(
枚举、结构体
)不支持继承,只有类
支持继承 -
基类:没有父类的类
Swift 并
没有
像 OC、Java 那样的规定:任何类最终都要继承自某个基类NOTE
Swift classes do not inherit from a universal base class. Classes you define without specifying a superclass automatically become base classes for you to build upon. -
子类可以重写父类的
下标、方法、属性
,重写必须加上override
关键字
重写实例方法、下标
class Animal {
func speak() {
print("Animal speak")
}
subscript(index: Int) -> Int {
return index
}
}
var animal: Animal = Animal()
animal.speak()
print(animal[6])
//Animal speak
//6
class Cat: Animal {
override func speak() {
super.speak()
print("Cat speak")
}
override subscript(index: Int) -> Int {
return super[index] + 2
}
}
var cat: Animal = Cat()
cat.speak()
print(cat[6])
//Animal speak
//Cat speak
//8
重写类型方法、下标
- 被
class
修饰的类型方法、下标,允许
被子类重写 - 被
static
修饰的类型方法、下标,不允许
被子类重写
class Animal {
class func speak() {
print("Animal speak")
}
class subscript(index: Int) -> Int {
return index
}
}
Animal.speak()
print(Animal[6])
//Animal speak
//6
class Cat: Animal {
override class func speak() {
super.speak()
print("Cat speak")
}
override class subscript(index: Int) -> Int {
return super[index] + 2
}
}
Cat.speak()
print(Cat[6])
//Animal speak
//Cat speak
//8
重写属性
- 子类可以将父类的属性(
存储、计算
)重写为计算属性
- 子类
不可以
将父类属性重写为存储属性
- 只能重写
var
属性,不能
重写let
属性 - 重写时,
属性名、类型
要一致
- 子类重写后的属性权限
不能小于
父类属性的权限- 如果父类属性是
只读
,那么子类重写后的属性可以是只读
,也可以是可读写
- 如果父类属性时
可读写
,那么子类重写后的属性也必须是可读写
- 如果父类属性是
重写实例属性
class Circle {
var radius: Int = 0
var diameter: Int {
set {
print("Circle setDiameter")
radius = newValue / 2
}
get {
print("Circle getDiameter")
return radius * 2
}
}
}
var circle: Circle = Circle()
circle.radius = 6
print(circle.diameter)
circle.diameter = 20
print(circle.radius)
//Circle getDiameter
//12
//Circle setDiameter
//10
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
}
}
}
var subCircle: Circle = SubCircle()
subCircle.radius = 6
print(subCircle.diameter)
subCircle.diameter = 20
print(subCircle.radius)
//SubCircle setRadius
//SubCircle getDiameter
//Circle getDiameter
//SubCircle getRadius
//12
//SubCircle setDiameter
//Circle setDiameter
//SubCircle setRadius
//SubCircle getRadius
//10
重写类型属性
- 被
class
修饰的计算类型属性
,可以
被子类重写 - 被
static
修饰的类型属性(存储、计算)
,不可以
被子类重写
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 static var diameter: Int {
set {
print("SubCircle setDiameter")
super.diameter = newValue > 0 ? newValue : 0
}
get {
print("SubCircle getDiameter")
return super.diameter
}
}
}
属性观察器
- 可以在子类中为父类属性(除了
只读计算属性
、let 属性
)增加属性观察器
class Circle {
var radius: Int = 2
}
class SubCircle: Circle {
override var radius: Int {
willSet {
print("SubCircle willSet", newValue)
}
didSet {
print("SubCircle didSet", oldValue, radius)
}
}
}
class Circle {
var radius: Int = 2 {
willSet {
print("Circle willSet", newValue)
}
didSet {
print("Circle didSet", oldValue, radius)
}
}
}
class SubCircle: Circle {
override var radius: Int {
willSet {
print("SubCircle willSet", newValue)
}
didSet {
print("SubCircle didSet", oldValue, radius)
}
}
}
class Circle {
var radius: Int {
set {
print("Circle setRadius", newValue)
}
get {
print("Circle getRadius")
return 20
}
}
}
class SubCircle: Circle {
override var radius: Int {
willSet {
print("SubCircle willSet", newValue)
}
didSet {
print("SubCircle didSet", oldValue, radius)
}
}
}
final
- 被
final
修饰的方法
、下标
、属性
,禁止
被重写 - 被
final
修饰的类、禁止
被继承
网友评论