所有面向?qū)ο笳Z言都具有三大特征:封裝、繼承、多態(tài)
1:簡介:
當有多個類具有相同的屬性和行為時,將共同的部分提取出來封裝成新的類,然后讓多個類繼承這個新類。(使代碼維護起來更加簡單)
(1)繼承:與現(xiàn)實生活中的繼承原理相同 。 例如:財產(chǎn)繼承、基因繼承等
(2)繼承講的是父與子的關(guān)系,子繼承于父。
編程語言中繼承指的是類與類之間的繼承
(3)關(guān)系:父類(parentClass) 、超類(superClass) 、基類
子類(childClass) 、子類(subClass)、 派生類
(4)重寫:子類繼承父類的方法,屬性,下標. 如果子類繼承父類的方法,屬性,下標,并不滿足子類的需求,子類可以將繼承過來的內(nèi)容進行重寫。
重寫就是方法名相同,內(nèi)容不同
(5)派生:子類也有自己的屬性、方法、下標,子類較父類多出的部分,稱為派生
2繼承的格式
class name: super class {
code
}
3單繼承
(1)swift語言中沒有統(tǒng)一的父類,如果定義類時沒有指定該類的父類,那么這個類就可以充當父類
(2)swift語言中的繼承指的是單繼承,一個子類只有一個直接父類??梢越柚鷧f(xié)議實現(xiàn)多繼承(和OC一樣),在后續(xù)的文章協(xié)議中會具體介紹
(3)一個類的屬性和方法在內(nèi)存中分為兩部分: 一部分是自身的屬性和方法,一部分是從父類繼承過來的屬性和方法。
(4)self關(guān)鍵字在實例方法中相當于對象,在類方法中相當于類名
程序?qū)嵗缦?
class Person {
var name: String = ""
static var age : Int = 0 // static也可以修飾屬性
func eat() -> Void {
print("\(name)正在吃東西")
}
func sleep() -> Void {
print("\(Person.age)正在睡覺")
// static修飾的屬性為類型屬性, 必須通過類名調(diào)用.非static修飾的屬性為存儲屬性 , 通過對象調(diào)用
}
static func hitDouDou () -> Void {
print("\(age)正的在打豆豆")
// <結(jié)論>self關(guān)鍵字在實例方法中相當于對象,在類方法中相當于類名
}
}
class Man: Person {
var height : Double = 0.0
func writeCoder() -> Void {
name = "ZZ"
Man.age = 11
print("\(name)今年:\(Man.age)歲了,身高:\(height),")
}
}
var man = Man.init()
man.height = 1.90
man.writeCoder()
man.eat()
man.sleep()
Man.hitDouDou()
4:重寫父類的方法
(1)子類重寫父類的方法,子類重寫的方法就會將父類的同名方法進行覆蓋,所以子類對象調(diào)用的同名方法是子類重寫的方法
(2)子類的方法名、參數(shù)列表,如果和父類中的方法完全相同,編譯器默認就是重寫方法,需要在方法名前加關(guān)鍵字override。
程序?qū)嵗缦拢?/p>
class Car {
var speed : Double = 90.0
var wheel : Int = 4
func run() -> Void {
print("速度為\(speed)的大眾速騰后懸掛斷了")
}
class func stop () {
print("因為斷軸不會跑了")
}
}
var car = Car.init()
car.run()
Car.stop()
class Bike: Car {
override func run() {
super.run() // super關(guān)鍵字!只是!用來調(diào)用父類的方法或者屬性,只是個關(guān)鍵字,沒有其它意義
print("跑丟了\(wheel)輪子")
}
// 父類中使用static修飾的方法/屬性 子類只能繼承 不能重寫
// 父類中使用class修飾的方法/屬性 子類可以重寫 但是很少使用class關(guān)鍵字定義方法
override class func stop () {
super.stop()
}
}
var bike = Bike.init()
bike.speed = 20.0
bike.wheel = 2
bike.run()
Bike.stop()
5重寫父類的屬性
(1)swift語言中是允許子類重寫父類的屬性的,可以為重寫的屬性指定get和set方法,實現(xiàn)對重寫屬性進行讀寫操作,也可以添加屬性觀察者willSet didSet
(2)子類重寫父類的屬性 ,如果父類的屬性是只讀屬性(get), 子類重寫的時候可以添加set方法 , 但是 如果父類的屬性是讀寫屬性(get,set) 子類重寫的時候如果只有只讀或者只寫部分,是會崩潰的。
程序示例如下:
class Cat {
var color : String = ""
var description: String {
// get {
return "??"
// }
}
}
class Panda: Cat {
override var color: String {
get{
return super.color
}
set{
super.color = newValue
}
}
override var description: String {
get {
return "國寶"
}
set {
print("重寫父類的計算屬性的set方法")
}
}
}
var panda = Panda.init()
panda.color = "黑白色"
print(panda.description)
6重寫父類下標
和父類的下標寫法幾乎一樣,見代碼如下
class Fruit {
var color : String = ""
subscript (index: Int) -> String {
set {
color = newValue
}
get {
return color
}
}
}
var f = Fruit.init()
f[0] = "Green"
print(f[0])
class Apple: Fruit {
override subscript (index: Int) -> String {
get {
return color + "蘋果"
}
set {
color = newValue
}
}
}
var apple = Apple.init()
apple[0] = "Rad"
print(apple[0])
7父類禁止子類重寫的方法
(1)關(guān)鍵字 final 可以修飾 類, 方法, 屬性, 下標
(2) final 修飾的 【類】是不能被繼承的 , final 修飾的方法、屬性、下標是不能被重寫的