2017-06-27 2 views
0

Je souhaite remplacer les propriétés de la classe suivante. Dites que j'ai une classe A qui a une propriété booléenne r. Pour la superclasse A, je veux r être réglé et obtenir normalement. Pour la sous-classe B, je veux que r soit toujours false. Je ne sais pas pourquoi cela est plus difficile que ce qu'elle devrait être ...Substitution de la propriété dans Swift 3

class A { 
    init(r: Bool) { 
     self.r = r 
    } 

    var r: Bool { 
     willSet(n) { 
      r = n 
     } 
     get { 
      return r 
     } 
    } 
} 

class B: A { 
    override var r: Bool { 
     willSet(n) { 
      r = n 
     } 
     get { 
      return false 
     } 
    } 
} 

let a = A(r: true) 
a.r = false 
print(a.r) // prints 'false', which is good 

let b = B(r: true) 
print(b.r) // prints 'true' 
b.r = false // ERROR: I can't get pass this point 'Execution was interrupted on playground 
print(b.r) 
+4

Votre code ne compile pas - vous ne pouvez pas utiliser un observateur de propriété ('willSet') avec une propriété calculée. Et même si elle compilait, 'get {return r}' provoquerait une boucle récursive, et les implémentations 'willSet' ne feraient rien. Vous voulez probablement juste une propriété stockée dans la classe de base, avec un remplacement de propriété calculé dans la sous-classe. – Hamish

+0

Pouvez-vous élaborer sur la façon d'utiliser la propriété stockée et de surcharger avec calculé dans la sous-classe? Je veux que 'r' soit toujours' false' dans la sous-classe. – 7ball

+1

Avez-vous vérifié la question similaire dans la section "Connexes"? –

Répondre

4

Je suis d'accord avec @Hamish: propriété stockée dans la classe de base, avec priorité de propriété calculée. Sauf qu'une propriété en lecture seule ne peut pas remplacer une propriété mutable. Mais, vous pouvez faire en sorte que le setter surchargé ne fasse rien, et le getter substitué renvoie ce que vous voulez.

class A { 
    init(r: Bool) { 
     self.r = r 
    } 

    var r: Bool 
} 

class B: A { 
    override var r: Bool { 
     set {} 
     get { 
      return false 
     } 
    } 
} 

let a = A(r: true) 
print(a.r) // "true" 
a.r = false 
print(a.r) // "false" 

let b = B(r: true) 
print(b.r) // "false" 
b.r = true 
print(b.r) // "false"