2016-11-01 1 views
2

Ich habe daran herumgebastelt, und ich habe mich gefragt, ob es Literatur zu diesem Thema gibt, oder irgendeine Art zu wissen, was das erwartete Verhalten ist. Hier ein Beispiel:Mischen von schnellen Objektbeobachtungsobjekten und Vererbung

class A { 
var paused:Bool = false { 
    willSet { print("Class A willSet on paused called") } 
    didSet { print("Class A didSet on paused called") } 
    } 
} 

class B : A { 
    override var paused:Bool { 
     willSet { print("Class B willSet on paused called") } 
     didSet { print("Class B didSet on paused called") } 
    } 
} 

class C : B { 
    override var paused:Bool { 
     willSet { print("Class C willSet on paused called") } 
     didSet { print("Class C didSet on paused called") } 
    } 
} 

let testC = C() 
testC.paused = true 

Wenn diese läuft ich diese Ausgabe erhalten:

Class C willSet on paused called Class B willSet on paused called Class A willSet on paused called Class A didSet on paused called Class B didSet on paused called Class C didSet on paused called

Es scheint, dass die willSet in der üblichen Weise von Polymorphismus genannt wird, aber didSet rückwärts genannt. Das ist irgendwie cool, aber wo ist dieses Verhalten dokumentiert? Ist ein Test, wie dies der einzige Weg, um es zu lernen?

Antwort

3

Die Reihenfolge der didSet Anrufe ist wie erwartet - jedes Kind nennt es willSet ist, dann Super ruft, dann nennt es didSet ist. Wenn Sie dies mit wörtlichen Aufrufen von super.pause tun würden, hätten Sie so etwas, was die Reihenfolge der didSet Anrufe klar macht:

class A { 
    var paused:Bool = false 

    func pause(_ paused:Bool) { 
     print("Class A will set paused") 
     self.paused=paused 
     print("Class A did set paused") 
    } 
} 

class B : A { 
    override func pause(_ paused:Bool) { 
     print("Class B will set paused") 
     super.pause(paused) 
     print("Class B did set paused") 
    } 
} 

class C : B { 
    override func pause(_ paused:Bool) { 
     print("Class C will set paused") 
     super.pause(paused) 
     print("Class C did set paused") 
    } 
} 

let testC = C() 
testC.pause(true)