对于继承这个名字大家应该都不陌生,在swift中也是一样,swift中的一个类可以继承另一个类的方法,属性和其他特性。当一个类继承其他类时,继承类叫做子类,被继承的类叫做父类,在swift中继承是区分类与其他类型的一个基本特征。
定义一个基类:
当一个类不继承其他类,这个类叫做基类。比如看下面的代码:
class vehicle { var maxPassengers : Int var manufacturer : String func description() -> String{ return " max passengers is \(maxPassengers) and manufacturer is \(manufacturer)" } init (){ maxPassengers = 2 manufacturer = "Designed By Weasley" } }
生成子类:
子类是在一个已有类的基础上创建一个新的类,子类继承与父类的特征,并且可以优化和改变这些特征,当然还可以为子类添加新的独有的特征。
子类的定义格式如下:
class <#name#>: <#super class#> { <#properties and methods#> }
比如,我们定义一个Bicycle类,继承于vehicle类:
<pre name="code" class="objc">class Bicycle: vehicle { var numberofWheels : Int = 2 var maxSpeed : Double = 30 override init() { super.init() maxPassengers = 2 } override func description() -> String { return "numberofWheels : \(numberofWheels) max passengers :\(maxPassengers) with max speed is \(maxSpeed) manufacturer is \(manufacturer)" } }
我们在子类中添加了2个新的属性,一个是numberofWheels,还有一个maxSpeed,重写了构造器init函数,还有重写了description函数,值得注意的是,我们重写父类中的某些函数的时候,需要在函数名称之前加上override关键字,否字系统编译器会报错。
这个时候我们创建一个Bicycle的实例,来看看我们的某些值是否正确:
var aBicycle = Bicycle() println(aBicycle.description())
numberofWheels : 2 max passengers :2 with max speed is 30.0 manufacturer is Designed By Weasley
访问父类的属性或方法:
当你在子类中重写超类的方法,属性或附属脚本时,有时在你的重写版本中使用已经存在的
超类实现会大有裨益。比如,你可以优化已有实现的行为,或在一个继承来的变量中存储一 个修改过的值。
在合适的地方,你可以通过使用 super 前缀来访问超类版本的方法,属性或附属脚本: 在方法 someMethod 的重写实现中,可以通过 super.someMethod()来调用超类版本的someMethod 方法。
在属性 someProperty 的 getter 或 setter 的重写实现中,可以通过 super.someProperty 来访问超类版本的 someProperty 属性。
在附属脚本的重写实现中,可以通过 super[someIndex]来访问超类版本中的相同附属脚本。
比如我们可以改写刚刚的Bicycle类:
class Bicycle: vehicle { var numberofWheels : Int = 2 var maxSpeed : Double = 30 override init() { super.init() maxPassengers = 2 } override func description() -> String { return super.description() + " ; " + "number of wheels \(numberofWheels) max speed \(maxSpeed)" } }
max passengers is 2 and manufacturer is Designed By Weasley;number of wheels 2 max speed 30.0
你可以重写继承来的实例属性或类属性,提供定制的getter和setter方法:
注意:如果你在重写属性中写了 setter,那么你也一定要写 getter。如果你不想在重写版本中的 getter 里修改继承来的属性值,你可以直接返回 super.someProperty 来返回继承 来的值。
class LimitSpeedBicycle: Bicycle { override var maxSpeed : Double{ get{ return super.maxSpeed } set{ super.maxSpeed = min(maxSpeed, 20) } } }
max passengers is 2 and manufacturer is Designed By Weasley ; number of wheels 2 max speed 20.0
class SpeedLevel: Bicycle { var level = 1 override var maxSpeed : Double{ didSet{ level = Int(maxSpeed / 10) + 1 } } override func description() -> String { return super.description() + " level is \(level)" } } var aBicycle = SpeedLevel() aBicycle.maxSpeed = 40 println(aBicycle.description())
max passengers is 2 and manufacturer is Designed By Weasley ; number of wheels 2 max speed 40.0 level is 5
原文地址:http://blog.csdn.net/weasleyqi/article/details/44154951