【Swift初见】Swift继承
对于继承这个名字大家应该都不陌生,在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" } } 我们定义了一个基类:vehicle,里面定义了2个属性,一个最大乘客数量:maxPassengers,一个制造商:manufacturer,一个init构造器,一个description函数。构造器用来设置属性的值,用于创建某个类型的一个新实例。这个以后再说。 生成子类: 子类是在一个已有类的基础上创建一个新的类,子类继承与父类的特征,并且可以优化和改变这些特征,当然还可以为子类添加新的独有的特征。 子类的定义格式如下: 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)" } } 此时我们的Bicycle子类已经创建完成,Bicycle就是vehicle的子类,它包含vehicle的所有特征,最大乘客数,制造商等。 我们在子类中添加了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 我们可以看出子类继承了父类的某些属性。
访问父类的属性或方法: 当你在子类中重写超类的方法,属性或附属脚本时,有时在你的重写版本中使用已经存在的 比如我们可以改写刚刚的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)" } } 看看Bicycle类中的description函数,这个函数就是重写了vehicle类的description函数,用super.description来获取父类的description函数。得到的结果是这样的: 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) } } } 这里重写了maxSpeed属性,当我们设置maxSpeed属性的时候,跟20相比,返回一个最小值。 max passengers is 2 and manufacturer is Designed By Weasley ; number of wheels 2 max speed 20.0 重写属性观察器: 我们可以在属性重写中为一个继承来的属性添加属性观察器,这样一来当属性发生变化的时候,我们就可以进行相应的操作。 注意:我们不可以为只读属性和常量属性添加属性观察器,因为常量和只读属性不可以被设置的,所以没法为他提供willset和didSet方法,看下面的例子: 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那么问题来了,如果我不想我的属性或者方法被重写怎么办? final关键字可以帮你解决这个问题:final var final class final func 欢迎大家共同指导学习。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |