swift学习-继承,构造-12/28

今天学了一些类和结构的内容。
书看到第147页,基本上一半了。
这周工作日只有4天,蛮好。 笔记如下:
1 继承。任何缺少关键字override的重写,都会被编译器诊断为错误。
可以使用super来访问超类版本的方法。
在实现方法时,可以通过super.someMethod来调用超类的方法。
在重写计算属性时,可以通过super.someProperty来访问超类的计算属性。
在下标脚本的重写实现中,可以通过super[someIndex]来访问超类版本中的相同下标。
你可以将一个继承来的只读属性重写为一个读写属性。但是你不可以将一个继承来的读写属性重写为一个只读属性。

class Vehicle {
    var currentSpeed = 0.0
    var description: String {
        return "traveling at \(currentSpeed) miles per hour"
    }

    func makeNoise() {}
}

class Bicycle: Vehicle {
    var hasBasket = false
}

class Tandem: Bicycle {
    var currentNumberOfPassengers = 0
}

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)"
    }
}

class AutomaticCar: Car {
    override var currentSpeed: Double { //重写存储属性
        didSet {
            gear = Int(currentSpeed/10.0) + 1
        }
    }
}

可以通过把属性,方法,或下标标记为final来防止它们被重写,只需在声明关键字前加上final即可。
final var,final fun。也可以在class前加final,将整个类标记为不可继承的。
2 构造过程。当你为存储型属性设置默认值或者在构造器中为其赋值时,它们的值是被直接设置的,不会触发任何属性观察器。
在调用构造器时,主要通过构造器中的参数名和类型来确定需要调用的构造器。如果你在定义构造器的时候没有定义外部名字,swift会为每个构造器的参数自动生成一个和内部名字相同的外部名字。
例如:

class AutomaticCar: Car {
    override var currentSpeed: Double { //重写存储属性
        didSet {
            gear = Int(currentSpeed/10.0) + 1
        }
    }

    var test1 = 2 {
        willSet {
            print("123")
        }
    }

    //init1
    override init() {}

    //init2
    init(_ test1: Int) {
        self.test1 = test1
    }

    //init3
    init(_ test1: Int, _ test2: Int) {}

    //init4
    init(test1: Int) {
        self.test1 = test1
    }

    //init5
    init(test2: Int) {
        self.test1 = test2
    }
}

//init1
var myCar1 = AutomaticCar()

print(myCar1.test1)
myCar1.test1 = 5

//init 2
var myCar2 = AutomaticCar(3)
//init 4
var myCar3 = AutomaticCar(test1: 4)
//init 5
var myCar4 = AutomaticCar(test2: 5)
//init 3
var myCar5 = AutomaticCar(2, 3)

构造过程中常量属性的修改。你可以在构造中的任意时间点修改常量的值(但只有一次),对某个实例来说,它的常量属性只能在定义它的类的构造过程中修改,不能在子类中修改。
3 类的构造。类的构造器分两种,指定构造器和便利构造器,这其中有三条规则:指定构造器必须调用其父类的指定构造器;便利构造器必须调用同一类中其他的构造器;便利构造器最终必须以调用一个指定构造器结束。
指定构造器必须总是向上代理。
便利构造器必须总是横向代理。
两段式构造过程:每个存储类型通过引入它们的类的构造器来设置初始值。当每一个存储型属性被确定后,第二阶段开始,它给每个类一次机会在新实例准备使用之前进一步定制它们的存储型属性。和java很类似。

晚上回去换条路,顺便买蛋卷。
一定要有啊.......

你可能感兴趣的:(swift学习-继承,构造-12/28)