<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
1、值型別(列舉、結構體)不支援繼承,只有類支援繼承
2、沒有父類別的類,稱為:基礎類別
Swift並沒有像OC、Java那樣的規定:任何類最終都要繼承自某個基礎類別。
3、子類可以重寫父類別的下標、方法、屬性,重寫必須加上override關鍵字。
class Animal { var age = 0 } class Dog : Animal { var weight = 0 } class ErHa : Dog { var iq = 0 }
let a = Animal() a.age = 10
看一下a需要多少記憶體,a是堆空間的,所以必然是16的倍數,最前面有8個位元組拿來放型別資訊,第二個8個位元組放參照計數相關的東西,再往後8個位元組才是放age,總共用到的是24個位元組,但是需要保證是16的倍數,所以是32個位元組。
Dog因為有繼承,所以等價於
class Animal { var age = 0 } class Dog : Animal { var weight = 0 } class Dog { var age = 0 var weight = 0 } class ErHa : Dog { var iq = 0 }
let d = Dog() d.age = 10 d.weight = 20
d物件裡面有兩個屬性,age和weight,各佔8個位元組,並且一般來說父類別的屬性記憶體靠前,d物件也佔用32個位元組,第一塊是型別相關的8個位元組,第二塊是參照計數相關的8個位元組,第三塊是儲存age的8個位元組,第四塊是儲存weight的8個位元組。
同樣的一個ErHa物件要有24個位元組儲存age、weight、iq,另外還有前面的16個位元組,所以是40個位元組,但是要保證是16的倍數,所以就是48。
重寫實體方法、下標
class Animal { func speak() { print("Animal speak") } subscript(index: Int) -> Int { return index } } class Cat : Animal { override func speak() { super.speak() print("Cat speak") } override subscript(index: Int) -> Int { return super[index] + 1 } } var anim: Animal anim = Animal() //Animal speak anim.speak() //6 print(anim[6]) anim = Cat() //Animal speak //Cat speak anim.speak() // 7 print(anim[6])
重寫型別方法、下標
1、被class修飾的型別方法、下標,允許被子類重寫
2、被static修飾的型別方法、下標,不允許被子類重寫
class Animal { class func speak() { print("Animal speak") } class subscript(index: Int) -> Int { return index } } class Cat : Animal { override class func speak() { super.speak() print("Cat speak") } override class subscript(index: Int) -> Int { return super[index] + 1 } }
static修飾的型別方法、下標重寫報錯
子類重寫可以用static修飾,只不過不能再繼續被重寫了
1、子類可以將父類別的屬性(儲存、計算)重寫為計算屬性
2、子類不可以將父類別屬性重寫為儲存屬性
3、只能重寫var屬性,不能重寫let屬性
4、重寫時,屬性名、型別要一致
5、子類重寫後的屬性許可權,不能小於父類別屬性的許可權
如果父類別屬性是唯讀的,那麼子類重寫後的屬性可以是唯讀的,也可以是可讀寫的。
如果父類別屬性是可讀寫的,那麼子類重寫後的屬性也必須是可讀寫的。
class Circle { var radius: Int = 0 var diameter: Int { set { print("Circle setDiameter") radius = newValue / 2 } get { print("Circle getDiameter") return radius * 2 } } } 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 circle = SubCircle() circle.radius = 6 //SubCircle setRadius print(circle.diameter) //SubCircle getDiameter //Circle getDiameter //SubCircle getRadius //12 circle.diameter = 20 //SubCircle setDiameter //Circle setDiameter //SubCircle setRadius print(circle.radius) //SubCircle getRadius //10
1、被class修飾的計算型別屬性,可以被子類重寫
儲存型別屬性只能用static來修飾。
2、被static修飾的型別屬性(儲存、計算),不可以被子類重寫
1、可以在子類中為父類別屬性(除了唯讀計算屬性、let屬性)增加屬性觀察器
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() circle.radius = 10 //SubCircle willSetRadius 10 //SubCircle didSetRadius 1 10
2、父類別和子類中都有屬性觀察器
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() circle.radius = 10 //SubCircle willSetRadius 10 //Circle willSetRadius 10 //Circle didSetRadius 1 10 //SubCircle didSetRadius 1 10
3、子類是可以給父類別中的計算屬性增加屬性觀察器的。
class Circle { class var radius: Int { set { print("Circle setRadius", newValue) } get { print("Circle getRadius") return 20 } } } class SubCircle: Circle { override static var radius: Int { willSet { print("SubCircle willSetRadius", newValue) } didSet { print("SubCircle didSetRadius", oldValue, radius) } } } SubCircle.radius = 10 // Circle getRadius (oldValue) // SubCircle willSetRadius 10 // Circle setRadius 10 // Circle getRadius (radius) // SubCircle didSetRadius 20 20
1、被final修飾的方法、下標、屬性,禁止被重寫
2、被final修飾的類,禁止被繼承
到此這篇關於Swift繼承Inheritance淺析介紹的文章就介紹到這了,更多相關Swift繼承內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45