//====================================继承======================================
/*
1.一个类可以从另一个类继承方法、属性和其他的特性。当一个类从另一个类继承的时候,继承的类就是所谓的子类,而这个类继承的类被称为父类。在 Swift 中,继承与其他类型不同的基础分类行为。
2.在 Swift 中类可以调用和访问属于它们父类的方法、属性和下标脚本,并且可以提供它们自己重写的方法,属性和下标脚本来定义或修改它们的行为。Swift 会通过检查重写定义都有一个与之匹配的父类定义来确保你的重写是正确的。
类也可以向继承的属性添加属性观察器,以便在属性的值改变时得到通知。可以添加任何属性监视到属性中,不管它是被定义为存储还是计算属性
3.任何不从另一个类继承的类都是所谓的基类。
*/
//基类 相当于oc的父类
class Vehicle {
var currentSpeed = 0.0
var description:String{
return "now speed is(currentSpeed)"
}
func makeNoice() {
}
}
let vehicle = Vehicle()
print("now is (vehicle.description)")
//子类 oc的子类
class someVehicle:Vehicle {
var color = "white"
}
//子类可以调用基类的方法 属性
let bicycle = someVehicle()
bicycle.currentSpeed = 1.2
print(bicycle.description)
//-------------------------------重--写-----------------------------------------
/*
1.子类可以提供它自己的实例方法、类型方法、实例属性,类型属性或下标脚本的自定义实现,否则它将会从父类继承。这就所谓的重写。
2.要重写而不是继承一个特征,你需要在你的重写定义前面加上 override 关键字。这样做说明你打算提供一个重写而不是意外提供了一个相同定义。意外的重写可能导致意想不到的行为,并且任何没有使用 override 关键字的重写都会在编译时被诊断为错误。
3.override 关键字会执行 Swift 编译器检查你重写的类的父类(或者父类的父类)是否有与之匹配的声明来供你重写。这个检查确保你重写的定义是正确的。
*/
class Train: Vehicle {
override func makeNoice() {
print("This is override");
}
}
let train = Train()
train.makeNoice()
//你可以通过在你的子类重写里为继承而来的只读属性添加Getter和Setter来把它用作可读写属性。不能把一个继承而来的可读写属性表示为只读属性。必须声明你重写的属性名字和类型,以确保编译器可以检查你的重写是否匹配了父类中有相同名字和类型的属性
class Car:Vehicle{
//只能是基类的只读属性 能够重写
override var description: String{
return "car is (self.currentSpeed)"
}
var gear = 0
}
let car = Car()
print(car.description)
//你可以使用属性重写来为继承的属性添加属性观察器。这就可以让你在继承属性的值改变时得到通知,无论这个属性最初如何实现
//不能给继承而来的常量存储属性或者只读的计算属性添加属性观察器。这些属性的值不能被设置,所以提供 willSet 或 didSet 实现作为重写的一部分也是不合适的
//也要注意你不能为同一个属性同时提供重写的setter和重写的属性观察器。如果你想要监听属性值的改变,并且你已经为那个属性提供了一个自定义的setter,那么你从自定义的setter里就可以监听任意值的改变
class AutomaticCar:Car{
override var currentSpeed: Double{
didSet{
gear = Int(currentSpeed/10) + 1
}
}
}
let auto = AutomaticCar()
auto.currentSpeed = 10
print(auto.gear)
//阻止重写
//你可以通过标记为终点来阻止一个方法、属性或者下标脚本被重写。通过在方法、属性或者下标脚本的关键字前写 final 修饰符(比如 final var , final func , final class func , fianl subscript )。
//你可以通过在类定义中在 class 关键字前面写 final 修饰符( final class )标记一整个类为终点。任何想要从终点类创建子类的行为都会被报告一个编译时错误。
final class OneClass {
}
class NewClass {
final var one = 1;//继承的子类 不能重写这个属性
}