子类生成(Subclassing)
子类生成(Subclassing)指的是在一个已有类的基础上创建一个新的类。子类继承超类的特性,并且可以优化或改变它。你还可以为子类添加新的特性。
为了指明某个类的超类,将超类名写在子类名的后面,用冒号分隔:
class SomeClass: SomeSuperclass {
// 类的定义
}
下一个例子,定义一个更具体的车辆类叫Bicycle
。这个新类是在 Vehicle
类的基础上创建起来。因此你需要将Vehicle
类放在 Bicycle
类后面,用冒号分隔。
我们可以将这读作:
“定义一个新的类叫Bicycle
,它继承了Vehicle
的特性”;
class Bicycle: Vehicle {
init() {
super.init()
numberOfWheels = 2
}
}
preview Bicycle
是Vehicle
的子类,Vehicle
是Bicycle
的超类。新的Bicycle
类自动获得Vehicle
类的特性,比如 maxPassengers
和numberOfWheels
属性。你可以在子类中定制这些特性,或添加新的特性来更好地描述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)。Tandem
从Bicycle
继承了两个属性,而这两个属性是Bicycle
从Vehicle
继承而来的。Tandem
并不修改轮子的数量,因为它仍是一辆自行车,有 2 个轮子。但它需要修改maxPassengers
的值,因为双人自行车可以坐两个人。
注意:
子类只允许修改从超类继承来的变量属性,而不能修改继承来的常量属性。
创建一个Tandem
类的实例,打印它的描述,即可看到它的属性已被更新:
let tandem = Tandem()
println("Tandem: \(tandem.description())")
// Tandem: 2 wheels; up to 2 passengers
注意,Tandem
类也继承了description
方法。一个类的实例方法会被这个类的所有子类继承。
易百教程移动端:请扫描本页面底部(右侧)二维码并关注微信公众号,回复:"教程" 选择相关教程阅读或直接访问:http://m.yiibai.com 。
加QQ群啦,易百教程官方技术学习群
注意:建议每个人选自己的技术方向加群,同一个QQ最多限加 3 个群。
- Java技术群: 227270512 (人数:2000,免费:否)
- MySQL/SQL群: 418407075 (人数:2000,免费:否)
- 大数据开发群: 655154550 (人数:2000,免费:否)
- Python技术群: 287904175 (人数:2000,免费:否)
- 人工智能深度学习: 456236082 (人数:2000,免费:否)
- 测试工程师(新群): 415553199 (人数:1000,免费:否)
- 前端技术群(新群): 410430016 (人数:1000,免费:是)
- C/C++技术(新群): 629264796 (人数:1000,免费:是)
- Node.js技术(新群): 621549808 (人数:1000,免费:是)
- PostgreSQL数据库(新群): 539504187 (人数:1000,免费:是)
- Linux技术: 479429477 (人数:2000,免费:否)
- PHP开发者: 460153241 (人数:2000,免费:否)
- Oracle数据库: 175248146 (人数:2000,免费:否)
- C#/ASP.Net开发者: 579821706 (人数:2000,免费:是)
- 数据分析师: 397883996 (人数:2000,免费:是)R语言,Matlab语言等技术