这是我参与更文挑战的第14天,活动详情查看: 更文挑战
概念
- 继承:一个类可以从另一个类继承方法、属性和其他特性
- 子类:继承的类
- 父类:被继承的类
- 基类:没有父类的类
- 子类可以调用和访问属于其超类的方法,属性和下标,并且可以重写这些方法,属性和下标的自己的重写版本,以优化或修改它们的行为
- 子类中可以为继承来的属性添加属性观察器,当属性值改变时,类就会被通知到
- 值类型(枚举、结构体)不支持集成,只有类支持继承
子类化
- 子类化就是在现有类的基础上创建新类的行为
- 子类继承父类的特征,然后可以对其进行细化。还可以向子类添加新特性
//父类
class Student {
var name = ""
func todoHomework(){
print("\(name) 写作业")
}
}
//子类
class Boy: Student{
var hobby = ""
func paly() {
print("\(name) 踢足球")
}
}
let boy = Boy()
boy.name = "李雷"
boy.todoHomework()
boy.paly()
log:
李雷 写作业
李雷 踢足球
复制代码
重写
子类可以重写父类的下标、方法、属性
-
重写实例方法,使用关键字
override
修饰class Student { func play(){ print("就是玩儿!") } } class Boy: Student{ override func play() { print("踢足球") } } let boy = Boy() boy.play() log: 踢足球 复制代码
-
重写实例属性
- 子类可以将父类的属性(存储、计算),重写为计算属性
- 子类不可以将父类的属性(存储、计算),重写为存储属性
- 只能重写
var
属性,不能重写let
属性 - 重写时属性名、类型要一致
- 子类重写后的属性权限不能小于父类的权限
- 如果父类属性是只读的,那么子类重写后的属性可以是只读的、也可以是可读可写的
- 如果父类属性是可读可写的,那么子类重写后的属性也必须是可读可写的
class Student { //存储属性 var name = "" //只读属性 var hobby : String { return self.name } } class Boy: Student{ //重写属性,将父类存储属性重写为计算属性 override var name: String { set { self.name = newValue } get { return self.name } } //重写属性,将父类只读属性重写为可读可写 override var hobby: String { set { self.name = newValue } get { return self.name } } } var boy = Boy() boy.name = "李雷" boy.hobby = "踢足球" 复制代码
-
重写类型方法
- 被
class
修饰的类型方法、下标,允许被子类重写 - 被
static
修饰的类型方法、下标,不允许被子类重写 - 如果父类定义方法时使用
class
修饰,子类重写时可以使用class
也可以使用static
来修饰
- 被
-
重写类型属性
- 被
class
修饰的计算类型属性,可以被子类重写 - 被
static
修饰的类型属性(存储、计算),不可以被子类重写
class Student { //static 子类无法重写 static var name = "" class var hobby :String { set { self.hobby = newValue } get { return self.hobby } } } class Girl: Student{ override static var hobby: String{ set { super.hobby = newValue } get { return super.hobby } } } Girl.name = "han meimei" Girl.hobby = "游泳" print(Girl.name) print(Girl.hobby) log: 韩梅梅 爱好 游泳 复制代码
- 被
防止重写(final
)
- 被
final
修饰的方法、下标、属性,禁止被重写 - 被
final
修饰的类,禁止被继承
class Student {
var name = ""
//无法被继承
final func play(){
print("就是玩儿")
}
}
class Boy: Student {
override var name: String{
get {
return super.name
}
set {
super.name = newValue
}
}
//用final修饰的方法,子类无法重写,编译器提示错误为`Instance method overrides a 'final' instance method`
// func play() {
// print("不让玩儿")
// }
}
var boy = Boy()
boy.name = "李雷"
boy.play()
复制代码
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END