Swift-重写-override

//定义一个基类

class Vehicle {

   var numberOfWheels: Int

   var maxPassengers: Int

   func description() -> String {

        return "\(numberOfWheels)wheels; up to \(maxPassengers) passengers"

    }

   init(){

        numberOfWheels = 0

        maxPassengers = 1

    }

}

 

//=====重写方法=====

class Car: Vehicle {

   var speed: Double = 0.0

    override init() {

       super.init()

        numberOfWheels = 4

        self.maxPassengers = 10

        super.maxPassengers = 20

        maxPassengers = 5 //继承了父类的属性,因此self.maxPassengers super.maxPassengersmaxPassengers都是指car的属性

    }

    override func description() -> String {//重写了方法

        return super.description() + "; " + "travelling at \(speed)mph"

    }

   func des1() -> String{

       return self.description()

    }

   func des2() -> ()->String {

        return self.description

    }

   func des3() {

       self.description()

    }

   func desc4()->String{

        return "self = \(self.maxPassengers),super = \(super.maxPassengers),maxPassengers = \(maxPassengers)"

    }

    

}

let car0 = Car()

car0.maxPassengers  //5

car0.numberOfWheels //4

car0.description()

car0.des1()

let dd = car0.des2()

car0.des2()() //4 wheels; up to 5 passengers; travelling at 0.0 mph

dd()//4 wheels; up to 5 passengers;travelling at 0.0 mph

car0.desc4()

 

 

 

//重写属性

//子类并不知道继承来的属性是储值型还是算值型,它只知道继承来的属性有一个名字和类型,所以在重写属性时必须把它的名字和类型都写出来

//储值属性可以重写为算值属性

//只读可以重写为读写;读写不能重写为只读

//不想重写getter,可以直接返回super.Someproperty

 

class SpeedLimitedCar:Car {

    override varspeed : Double { //重写了父类的属性speed,因此selfsuperspeed是两个不同的属性

       get {

           return super.speed

       }

       set {

           super.speed = min(newValue, 40.0)

       }

    }

   func CompareSpeed() -> String {

        return "super = \(super.speed), self = \(self.speed)"

    }

}

let Scar0 = SpeedLimitedCar()

Scar0.speed = 60.0

Scar0.description()

Scar0.CompareSpeed() //super=40.0 self=40.0

 

class UnLimitedCar: SpeedLimitedCar {

   override var speed : Double {

       get {

           println("speed0 = \(super.speed)")

           return super.speed + 10.0

       }

       set {

           println("speed1 = \(super.speed)")

           super.speed = newValue + 5.0

           println("speed2 = \(super.speed)")

       }

    }

}

let Ucar0 = UnLimitedCar()

Ucar0.speed = 20.0

Ucar0.description() //35.00

Ucar0.CompareSpeed()//super=25.0,self=35.0

 

//重写属性观察器

//可以为继承来的变量储值属性添加属性观察器

//可以值重写didSetwillSet

class AutomaticCar: Car {

   var gear = 1

   override var speed: Double {

       didSet{

           gear = Int(speed / 10.0) + 1

       }

    }

   override func description() -> String {

       return super.description() + " in gear \(gear)"

    }

}

 

let automatic = AutomaticCar()

automatic.speed = 50

automatic.description() //........travelling at 50.0 mph in gear 6

 

 

//防止重写

//通过把方法、属性或下标标记为final来防止它们被重写

//在扩展中,添加到类里的方法、属性或下标也可以在扩展的定义里标记为final

//可以在class前添加final来将整个定义为不能重写,这样的类是不可继承的

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值