发布于 2015-06-14 01:45:14 | 165 次阅读 | 评论: 0 | 来源: 网络整理

子类生成(Subclassing)

子类生成(Subclassing)指的是在一个已有类的基础上创建一个新的类。子类继承超类的特性,并且可以优化或改变它。你还可以为子类添加新的特性。

为了指明某个类的超类,将超类名写在子类名的后面,用冒号分隔:


class SomeClass: SomeSuperclass {
    // 类的定义
}

下一个例子,定义一个更具体的车辆类叫Bicycle。这个新类是在 Vehicle类的基础上创建起来。因此你需要将Vehicle类放在 Bicycle类后面,用冒号分隔。

我们可以将这读作:

“定义一个新的类叫Bicycle,它继承了Vehicle的特性”;


class Bicycle: Vehicle {
    init() {
        super.init()
        numberOfWheels = 2
    }
}

preview BicycleVehicle的子类,VehicleBicycle的超类。新的Bicycle类自动获得Vehicle类的特性,比如 maxPassengersnumberOfWheels属性。你可以在子类中定制这些特性,或添加新的特性来更好地描述Bicycle类。

Bicycle类定义了一个构造器来设置它定制的特性(自行车只有2个轮子)。Bicycle的构造器调用了它父类Vehicle的构造器 super.init(),以此确保在Bicycle类试图修改那些继承来的属性前Vehicle类已经初始化过它们了。


注意:
不像 Objective-C,在 Swift 中,初始化器默认是不继承的,见初始化器的继承与重写
 

Vehicle类中maxPassengers的默认值对自行车来说已经是正确的,因此在Bicycle的构造器中并没有改变它。而numberOfWheels原来的值对自行车来说是不正确的,因此在初始化器中将它更改为 2。

Bicycle不仅可以继承Vehicle的属性,还可以继承它的方法。如果你创建了一个Bicycle类的实例,你就可以调用它继承来的description方法,并且可以看到,它输出的属性值已经发生了变化:


let bicycle = Bicycle()
println("Bicycle: (bicycle.description())")
// Bicycle: 2 wheels; up to 1 passengers

子类还可以继续被其它类继承:


class Tandem: Bicycle {
    init() {
        super.init()
        maxPassengers = 2
    }
}

上面的例子创建了Bicycle的一个子类:双人自行车(tandem)。TandemBicycle继承了两个属性,而这两个属性是BicycleVehicle继承而来的。Tandem并不修改轮子的数量,因为它仍是一辆自行车,有 2 个轮子。但它需要修改maxPassengers的值,因为双人自行车可以坐两个人。


注意:
子类只允许修改从超类继承来的变量属性,而不能修改继承来的常量属性。
 

创建一个Tandem类的实例,打印它的描述,即可看到它的属性已被更新:


let tandem = Tandem()
println("Tandem: (tandem.description())")
// Tandem: 2 wheels; up to 2 passengers

注意,Tandem类也继承了description方法。一个类的实例方法会被这个类的所有子类继承。

最新网友评论  共有(0)条评论 发布评论 返回顶部

Copyright © 2007-2017 PHPERZ.COM All Rights Reserved   冀ICP备14009818号  版权声明  广告服务