2017-09-23 1 views
2

Ich war gerade in swift mit Vererbung einige Experimente zu tun, und das ist mein Code:Eltern-Kind-Beziehung Verwirrung mit Bezug Semantik (swift)

class parent { 
    var value: Int? 
} 

class child1: parent { 

    func setParent() { 
     value? = 213 
    } 
} 

class child2: parent { 

    func setParent(){ 
     value? = 234 
    } 
} 

let a = child1() 
let b = child2() 

a.setParent() 

print(b.value) //nil 
print(a.value) //nil 

Ich habe Setup eine parent Klasse, die nur einen Wert Eigenschaft hat, und ich habe eine child1 und child2, die von parent erbt.

Unter der Referenzsemantik, wenn ich die value Eigenschaft auf einen Wert (213) gesetzt ist, wenn ich den Wert unter child2 gehen zu überprüfen, sollte ich den gleichen Wert, weil child1 und child2 beide erbt von parent, zeigte auf dem parent Klasse. Aber es stellt sich heraus, dass, wenn ich die Werte drucke, beide null sind ... kann jemand das erklären?

Danke!

+0

Vollständig nicht verwandt, würde ich vorschlagen, Standardnamenskonventionen zu folgen, wobei die Klassen 'Child1',' Child2' und 'Parent' mit Großbuchstaben beginnen sollten. Es macht Ihren Code weniger verwirrend. Variablen und Methoden sollten mit Kleinbuchstaben beginnen, aber Klassen, Strukturen, Protokolle usw. sollten mit Großbuchstaben beginnen. – Rob

Antwort

2

Sie haben

value? = 213 

und

value? = 234 

Diejenigen sagen "wenn es nicht nil ist, den Wert auf 213 gesetzt (oder 234, respectively)". Das ist offensichtlich nicht das, was du meinst.

Sie sollten diese ? entfernen, wenn Sie diese Werte zuweisen. Das heißt, sollten diejenigen sein, die jeweils:

value = 213 

und

value = 234 

Sobald wir festgelegt, dass Sie mit weiterverfolgt:

Sollten wir nicht erwarten b.value auch Ertrag der Wert 213? "

Nein. Die a ist eine Instanz von child1 mit einer Instanzeigenschaft value, die sie von der Oberklasse parent erbt. Die b ist eine vollständig separate Instanz, eine child2, die ihre eigene Instanzvariable value von der Oberklasse parent erbt. Nur weil child1 und child2 erben von parent ändert sich nicht die Tatsache, dass value ist eine Instanz Eigenschaft, und damit separate Instanzen a und b erhalten ihre eigenen Instanzen von value.

+0

wie kommt es? Der Wert innerhalb von 'Eltern' ist optional? Ich habe es auch versucht und es hat funktioniert. Aber sollten wir nicht erwarten, dass "b.value" auch den Wert "213" ergibt? –

+0

"How Come" ... Es ist effektiv optionale Verkettung. Z.B. 'object? .someMethod()' ruft 'someMethod' nur dann auf, wenn' object' nicht 'nil' ist. Das gleiche gilt für '='. Wert machen? = ... 'wird nur' = 'wenn' value' nicht 'nil' ist. – Rob

+0

"sollten wir nicht erwarten, dass' b.value' auch den Wert '213' ergibt?" ... nein, siehe erweiterte Antwort oben. – Rob

Verwandte Themen