初學swift筆記 繼承(十)

  1 import Foundation
  2 /*
  3 繼承
  4 
  5 class childClass: FatherClass{
  6 
  7 }
  8 優點 代碼重用
  9 缺點 增加程序的藕合度 父類的改變會影響子類
 10 
 11 只能單繼承
 12 */
 13 class Human{
 14     var name: String=""
 15     var id: Int=0
 16     func eat(){
 17         println("吃飯")
 18     }
 19     func drink(){
 20         println("喝水")
 21     }
 22     func sleep(){
 23         println("睡覺")
 24     }
 25 }
 26 class Woman : Human {
 27     
 28     func birth(){
 29         println("birth")
 30     }
 31 }
 32 
 33 let w_woman = Woman()
 34 w_woman.eat()
 35 w_woman.name="aaa"
 36 
 37 //super關鍵字  派生類中的方法實現中,可以通過super關鍵字來引用基類的屬性和方法
 38 
 39 class LSQ : Human{
 40     func eatAndSleep(){
 41         super.eat() //用super修飾此方法 ,告訴編譯器到當前類的父類去查找。表示調用父類的方法
 42         sleep()
 43         say()
 44     }
 45     func say(){
 46         println("hello")
 47     }
 48 }
 49 //方法 屬性重寫 override關鍵字
 50 class LSQ1 : Human{
 51     func eatAndSleep(){
 52         super.eat() //調用父類方法
 53         super.sleep()
 54     }
 55     override func eat() {//重寫父類方法
 56         println("LSQ1 eat")
 57     }
 58     
 59 }
 60 
 61 let lsq_1 = LSQ1()
 62 lsq_1.eatAndSleep()
 63 lsq_1.eat()
 64 
 65 class  Father{
 66     var storePreperty: Int = 0 //存儲屬性
 67     var coputePreperty: Int{ //計算屬性
 68         get{
 69             return 0
 70         }
 71         set{
 72             println("In Father Class Set \(newValue)")
 73         }
 74     }
 75     var coputePrepertys: Int{ //計算屬性
 76         get{
 77             return 0
 78         }
 79     }
 80 }
 81 //重寫的屬性 呈現的是計算屬性
 82 /*重寫的限制,
 83 1.屬性重寫,父類如果有get set 子類重寫後必須擁有get set
 84 2.不可以重寫爲只讀的計算屬性
 85 3.父類計算屬性是隻讀的時候,子類可重寫爲只讀、讀寫的計算屬性
 86 
 87 屬性權利可以放大,不可以減小
 88 */
 89 class Child: Father {
 90     //將父類的存儲屬性重寫爲計算屬性,不可以將存儲屬性重寫成存儲屬性
 91     override var storePreperty : Int { //重寫了父類的存儲屬性
 92         get{
 93             return 10
 94         }
 95         set{
 96             println("In Child Class Set \(newValue)")
 97         }
 98     }
 99     //父類的計算屬性,重寫爲計算屬性 ,不可以重寫爲存儲屬性
100     override var coputePreperty : Int{
101         get{
102             return 90
103         }
104         set{
105             println("child coputePreperty")
106         }
107     }
108     //重寫只讀的計算屬性
109     override var coputePrepertys : Int{
110         get{
111             return 90
112         }
113         set{
114             println("child coputePreperty")
115         }
116     }
117 }
118 
119 var test = Child()
120 println(test.storePreperty)
121 
122 
123 /*
124 重寫 屬性觀察器
125 1.只能給非lazy屬性的變量存儲屬性設定屬性觀察器,不能給計算屬性設定屬性觀察器
126 2.父類屬性必須是可讀寫的,否則不能重寫屬性觀察器
127 */
128 class myF{
129     var name: String = ""  {
130         willSet{
131             println("修改前\(newValue)")
132         }
133         didSet{
134             println("修改後\(oldValue)")
135         }
136     }
137     
138 }
139 class my_a: myF{
140     override var name : String {
141         willSet{
142             println("重寫修改前\(newValue)")        }
143         didSet{
144             println("重寫修改後\(oldValue)")
145         }
146     }
147     func getname() -> String {
148         return super.name
149     }
150 }
151 //重寫了屬性觀察器,並沒有重寫存儲屬性
152 var my_z = my_a()
153 my_z.name="LSQ"
154 println(my_z.name)
155 println(my_z.getname())
156 
157 /*
158 防止重寫
159 關鍵字 final
160 修飾類 表示 類不可以被繼承
161 修飾屬性或方法,表示相應的屬性或方法不能被重寫
162 */
163  class Test_Father{
164   final  var name: String = "abc"
165     final func getName(){
166         println("getName")
167     }
168 }
169 
170 class Test_child: Test_Father {
171   //  override var name: String = "a"  //報錯,不可以重寫
172     // override func getName(){} //報錯,不可以重寫
173 
174     
175 }

 

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章