Swift学习笔记2---继承(Inheritance)
- 在Swift中,继承是区分【类】与其他类型的一个基本特征。
-
不继承于其它类的类,称之为基类(base calss)。
-
子类生成(Subclassing)指的是在一个已有类的基础上创建一个新的类。子类继承超类的特性,并且可以优化或改变它。你还可以为子类添加新的特性。
-
子类可以为继承来的实例方法(instance method),类方法(class method),实例属性(instance property),或下标脚本(subscript)提供自己定制的实现(implementation)。我们把这种行为叫重写(overriding)。
-
你可以通过把方法,属性或下标脚本标记为final来防止它们被重写,只需要在声明关键字前加上final特性即可。(例如:final var, final func, final class func, 以及 final subscript)
//
// main.swift
// Inheritance
// 继承
//
// Created by TSUBASA on 15/12/18.
// Copyright © 2015年 TSUBASA. All rights reserved.
//
import Foundation
// 继承
/**
* 在Swift中,继承是区分【类】与其他类型的一个基本特征
*/
//base class 基类
class Vehicle {
var currentSpeed = 0.0
var description: String {
return "traveling at \(currentSpeed) miles per hour"
}
func makeNoise() {
// 什么都不做
}
}
let someVehicle = Vehicle()
print("Vehicle: \(someVehicle.description)")
/**
* 子类
class SomeSubclass: SomeSuperclass {
}
*/
// 定义一个Vehicle的子类
class Bicycle: Vehicle {
var hasBasket = false
}
let bicycle = Bicycle()
bicycle.hasBasket = true
bicycle.currentSpeed = 15.0
print("Bicycle: \(bicycle.description)")
// 子类还可被其他类继承,成为父类
// 双人自行车类 继承于 自行车类
class Tandem: Bicycle {
var currentNumberOfPassengers = 0
}
let tandem = Tandem()
tandem.hasBasket = true
tandem.currentNumberOfPassengers = 2
tandem.currentSpeed = 22.0
print("Tandem: \(tandem.description)")
// Overriding Methods 重写方法
class Train: Vehicle {
override func makeNoise() {
print("Choo Choo")
}
}
let train = Train()
train.makeNoise()
class Car: Vehicle {
var gear = 1
override var description: String {
return super.description + " in gear \(gear)"
}
}
let car = Car()
car.currentSpeed = 25.0
car.gear = 3
print("Car: \(car.description)")
class AutomaticCar: Car {
override var currentSpeed: Double {
didSet {
gear = Int(currentSpeed / 10.0) + 1
}
}
}
let automatic = AutomaticCar()
automatic.currentSpeed = 35.0
print("AutomaticCar: \(automatic.description)")
/**
* 防止重写 Preventing Overrides
*/
// 使用final特性
// final var, final func, final class func, final subscript
// 如果重写了final方法,属性或下标属性,编译时不会报错。
// 也可以在类前加上final将整个类标记为final的,这样的类无法继承,任何试图继承此类,编译时会报错。
岂能尽如人意,但求无愧于心。

浙公网安备 33010602011771号