2016-04-17 5 views
2

Scheint wie eine verwirrende Frage zu Wort, aber es ist eigentlich ziemlich einfach. Ich möchte so etwas wie dies zu tun, aber Swift wird es nicht zulassen, dass:Swift: Überschreibe Unterklasseneigenschaften, die auch Unterklassen der Elternklasse sind. Klasse

class A {} 
class B : A {} 
class C { 
    var prop: A? 
} 
class D : C { 
    override var prop : B? 
} 
+2

D ist keine Unterklasse von irgendetwas. Könnten Sie Ihre Frage noch einmal klären? –

+0

@EvdzhanMustafa oops vertippen Bitte überprüfen Sie jetzt –

+0

@ThomMorgan Worüber beklagt sich der Compiler genau? –

Antwort

3

von here Genommen:

Zwingende Property Getter und Setter

Sie eine benutzerdefinierte Getter zur Verfügung stellen kann (und Setter (falls zutreffend) zu überschreiben alle geerbten Eigenschaften, unabhängig davon, ob die vererbte -Eigenschaft als gespeicherte oder berechnete Eigenschaft an der Quelle implementiert ist. Die gespeicherte oder berechnete Eigenschaft einer geerbten Eigenschaft ist unter einer Unterklasse nicht bekannt. Sie weiß nur, dass die geerbte Eigenschaft einen bestimmten -Namen und -Typ hat. Sie müssen immer den Namen und den Typ der überschriebenen -Eigenschaft angeben, damit der Compiler überprüfen kann, ob Ihre -Überschreibung einer Superklasseneigenschaft mit demselben Namen und Typ entspricht.

Scheint, dass Sie das nicht tun können.

+0

dang das irgendwie scheiße –

0

Es gibt keinen vernünftigen Weg, um das zu tun, was Sie fragen, nämlich Kovarianz/Kontravarianz. Stellen Sie sich vor diesen Code:

func storeProperty(_ c: C) { 
    c.prop = A() 
} 

let d = D() 
storeProperty(d) 
let b: B = d.prop 

Wenn Ihre Idee zu arbeiten waren, haben wir eine Art Fehler - eine Variable vom Typ B, die kein B zur Laufzeit enthält!

Verwandte Themen