swift之类的继承
知识点:
1、类的继承、重写等概念;
2、子类和父类的属性和方法关系;
继承(Inheritance)
综述:一个类可以继承(inherit)另一个类的方法(methods),属性(properties)和其它特性。当一个类继承其它类时,继承类叫子类(subclass),被继承类叫超类(或父类,superclass)。在 Swift 中,继承是区分「类」与其它类型的一个基本特征。
首先定义一个基类
下面的例子定义了一个叫Vehicle的基类。这个基类声明了一个名为currentSpeed,默认值是0.0的存储属性(属性类型推断为Double)。currentSpeed属性的值被一个String 类型的只读计算型属性description使用,用来创建车辆的描述。
Vehicle基类也定义了一个名为makeNoise的方法。这个方法实际上不为Vehicle实例做任何事,但之后将会被Vehicle的子类定制:
class Vehicle {
var currentSpeed = 0.0
var description: String {
return "traveling at \(currentSpeed) miles per hour"
}
func makeNoise() {
// 什么也不做
}
}
您可以用初始化语法创建一个Vehicle的新实例,即类名后面跟一个空括号:
let someVehicle = Vehicle()
现在已经创建了一个Vehicle的新实例,你可以访问它的description属性来打印车辆的当前速度。
print("Vehicle: \(someVehicle.description)")
// Vehicle: traveling at 0.0 miles per hour
创建子类并继承父类
继承的格式:为了指明某个类的超类,将超类名写在子类名的后面,用冒号分隔:子类会自动获得父类的所有属性和方法,还可以添加属性和方法。
class SomeClass: SomeSuperclass {
// 类的定义
}
这里定义一个叫Bicycle的子类,继承成父类Vehicle
class Bicycle: Vehicle {
var hasBasket = false //新添加一个属性,推断为boolean类型
}
使用:
let bicycle = Bicycle()
bicycle.hasBasket = true
bicycle.currentSpeed = 15.0 //修改父类属性值
print("Bicycle: \(bicycle.description)")
// Bicycle: traveling at 15.0 miles per hour
重写(Overriding)
重写方法:
下面的例子定义了Vehicle的一个新的子类,叫Train,它重写了从Vehicle类继承来的makeNoise方法:
class Train: Vehicle {
override func makeNoise() {
print("Choo Choo")
}
}
重写属性:
class Car: Vehicle {
var gear = 1
override var description: String {
return super.description + " in gear \(gear)"
}
}
重写的description属性,首先要调用super.description,然后在后面添加自己需要的信息。
class AutomaticCar: Car {
override var currentSpeed: Double {
didSet {//didSet在新的值被设置之后立即调用,willSet在新的值被设置之前调用
gear = Int(currentSpeed / 10.0) + 1
}
}
}
运行结果:
let automatic = AutomaticCar()
automatic.currentSpeed = 35.0
print("AutomaticCar: \(automatic.description)")
// AutomaticCar: traveling at 35.0 miles per hour in gear 4
防止重写
只要在属性和方法中,在方法和属性前面用final修饰词(例如:final var, final func, final class func, 以及 final subscript)。
如果你重写了final方法,属性或下标脚本,在编译时会报错。
你可以通过在关键字class前添加final特性(final class)来将整个类标记为 final 的,这样的类是不可被继承的,任何子类试图继承此类时,在编译时会报错。