swift 笔记 (十三) —— 继承

继承
一个类可以从其它类继承方法,属性以及一些特征。被继承的类叫父类,那另一种就是子类了。。这个我们都懂的。。  



这是一个官方给的例子,它是一个 基类(Base Class),因为它没有继承任何一个类,这个类里面有一个init方法,我们暂时忽略,只要知道这是个初始化方法,在我们创建一个类的实例的时候,这个方法会被执行,下一篇笔记会详细分析。

class MyCar : Vehicle {           //继承的语法
     init () {                               //MyCar 类的初始化方法
           super.init()                   //MyCar的父类 Vehicle的初始化方法
          numberOfWheels = 4           //从Vehicle继承过来的属性
     }
}

这样,我的小车车就拥有了4个轮子,以及1位乘客(继承自父类)........但,这怎么都不像汽车。。。貌似在我上初中的时候,奔驰出过一款三轮流线型只有1位乘客的汽车,但后来为啥没有生产就不知道了。。。。

C++会自动继承初始化方法,C++也会自动执行默认的初始化方法,而swift既不会继承父类的初始化,也不会自动执行父类的初始化方法, 囧。。。。

(马赛洛进球了。。。本届世界标的第一枚。。。笑尿了)

我的小车车只有一个乘客。。。。不够啊。。。让我们多加几个乘客吧!可是,在swift中,只允许在初始化阶段改变父类的属性变量。。。于是,我们只好重新写这个MyCar类了:

class MyCar : Vehicle {          
     init () {                              
           super.init()                  
          numberOfWheels = 4          
           maxPassengers = 5     //唔,我的小车车终于可以坐5个人了(包括我自己)
     }

let car = MyCar()           //这句会自动执行 MyCar类的 init方法
println(“car : \(car .description())”)           //description方法是从父类继承来的,在MyCar类里并没有定义

方法重写(Overriding Methods)
看到这个例子的时候笑尿了,官方竟然也用了Car。。。。你的Bicycle呢?(上一个例子中,官方用的是Bicycle类)不管官方用啥吧,我还是继续为我的MyCar做下美容:

class MyCar: Vehicle {
     var speed: Int = 0           //为小车加上速度属性

     init() {
          super.init()
          numberOfWheels = 4
          maxPassengers = 5
     }

      override func description() -> String {      // 注意 override关键字
          return super.description() + “ now speed is \(speed) mph”    //只是在父类的description输出内容后面加字
     }
}

这样,我们就重写了从父类继承过来的 description方法的行为
let car = MyCar()
println(“car : \(car.description())")

(内马尔~帅~ 进了!!!)
(解说员:“上半场打到30分钟,已经有两个进球了,这场比赛很精彩”  哈哈哈 笑尿了)

我们也可以对父类属性的set和get 方法进行重写,但是必须写清属性名和属性类型。
这种重写,是完全忽略这个属性在父类中定义成用于计算的或者是用于存储的,甚至,在子类中提供set和get方法,就可以把父类的“只读”型属性重写成“读写”型属性。
当然,如果我们在重写属性的时候,提供了一个set 方法,那么必须还要再提供一个get方法才行。

上海的高架限速是100mph, 所以,我还得为我的车车加个限速:

class MySpeedLimitedCar: MyCar {
      override var speed: Int {                //override 指出这是一个重写的属性
     get {
          return super.speed
     }
     set {
          println(“car must seed limited lower than 100 mph.")
          super.speed = min( newValue, 100)      //newValue是 set默认提供的,前面的笔记有说过
     }
     }
}

let car = MySpeedLimitedCar()
car.speed = 101          //这里会输出一行提示,然后speed的值会被设置为100

重写属性的监听者 (Overriding Property Observers)
我们不能为一个不能改变值的属性重写属性的监听者,比如继承来的常量,继承来的”只读“型用于计算的属性。
为一个属性同时加入set方法和监听者,也是不可以的。

现在,我需要给我的小车车升级为自动档,手动档太累了。

class AutomaticCar: Car {     
     var gear = 1                //档位
     override var speed: Int {
      didSet {           //为speed属性加入监听者
          gear = speed / 10 + 1           //根据speed值设置 档位 属性
     }
     }

     overrid func description() -> String {
          return super.description() + “ in great \(gear)"
     }
}

let car = AutomaticCar()
automatic.speed = 60
println(“my car: \(car.description())")

防止重写
在很多时候,我们需要防止子类重写我们的类。
swift 提供了 @final 关键字,用来修饰我们需要防止子类的属性,方法,或者是下标 ,甚至是在类定义前面写上@final。

比如,我们在本期开头帖图的那个Vehicle类中的  func description()-> String的最前面加上@final, 让它变成:

@final func description() -> String {           //这里只在最前面加了个 @final
     return “\(numberOfWheels) wheels; up to \(maxPassenger) passengers"
}

那么,我们可以在子类 MyCar中,overrid func description() -> String的地方,发现一条编译错误:
Instance method overrides a ‘final’ instance method


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值