2015-11-03 19 views
5

Mi sembra che questo dovrebbe essere relativamente semplice ma non riesco a trovare un modo per realizzarlo.Nascondere l'accesso alla proprietà di un genitore nella sottoclasse

Let dire che ho

class Parent { 
    public var file: PFFile? 
} 

e una sottoclasse

class Child : Parent { 
    // some functionality that hides access to super.file 
} 

problema è posso non si scherza con la classe Parent, ma io non voglio che nessuno utilizzando la classe bambino avere accesso a "file". Come posso realizzare questo in Swift?

+0

Rimozione del modificatore 'public'? – NeverHopeless

+0

Purtroppo non posso modificare la classe genitore –

risposta

0

Come per Swift documentation

È possibile impedire un metodo, una proprietà o pedice di essere sovrascritti contrassegnandolo come finale. Fatelo scrivendo il modificatore finale prima del il metodo, la proprietà o la parola chiave dell'introduttore del pedice (come l'ultima var, l'ultima funzione, la classe finale func e l'indice finale).

in modo da poter dichiarare classe genitore come

class Parent { 
    final var file: PFFile? 
} 

Oppure, se non è possibile modificare classe padre allora forse questo avrebbe funzionato

class Child : Parent { 
    override private final var file: PFFile? 
} 
+0

sei in grado di "sovrascrivere" la proprietà memorizzata? hm ... – user3441734

+0

L'esempio 'class Child: Parent' non verrà compilato perché l'override deve essere una proprietà calcolata. – mogelbuster

0

Forse questo risolvere il problema:

class Parent { 
    public var file: PFFile? 
} 

class RestrictedParent : Parent { 
    private override var file: PFFile? 
} 

class Child : RestrictedParent { 
    // some functionality that hides access to super.file 
} 

Qui in RestrictedParent, possiamo nascondere qualsiasi funzionalità che non dovrebbe essere visibile a nessuna classe figlia che la erediti.

EDIT:

A part from doc:

class Car: Vehicle { 
    var gear = 1 
    override var description: String { 
     return super.description + " in gear \(gear)" 
    } 
} 
+0

hai mai provato a sovrascrivere la proprietà archiviata? – user3441734

+0

@ user3441734, si prega di dare un'occhiata agli aggiornamenti. – NeverHopeless

+0

si esegue l'override della proprietà calcolata, non la proprietà memorizzata – user3441734

-1

È possibile utilizzare il modificatore final, in questo modo:

class Perent { 
    final var file: PFFile? 
}  

class Child: Perent { 
    // code here ... 
} 
+0

Non può modificare la classe genitore – mogelbuster

0

non credo che questo è direttamente possibile a Swift 3 Ecco la soluzione migliore che potrei trovare:

class Child : Parent { 
    override public var file: PFFile? { 
     get { return nil } 
     set { } 
    } 
    func exampleFunction() { 
     print(super.PFFile?.description) // Use like this 
     print(PFFile?.description)  // Don't do this 
     //This ^^^ will ALWAYS return nil for PFFile 
    } 
} 

Questa è una specie di trucco, ma fa quasi esattamente quello che vuoi. Non nasconde completamente la variabile dal mondo esterno, ma lo rende impotente. Quando provi ad accedere a file ottieni sempre nil, e quando provi ad assegnare un valore al file non fa nulla. Quindi il mondo esterno sa ancora che Child ha una proprietà file di tipo PFFile?, ma non può fare nulla al riguardo.

In sostanza, file è come una star del cinema attraente. Puoi inviare loro lettere, postare sulla loro bacheca di Facebook, commentare il loro feed di Instagram, ma non ti risponderanno mai. Sai chi sono e come sono, ma non puoi farci niente.

Poi, all'interno Child si MUST uso super.fileOVUNQUE accesso Parent s' file proprietà. Se usi file o self.file, proverai a interagire con la versione impotente e non farai nulla e non otterrai nulla ogni volta! Ho incluso exampleFunction() come esempio di questo utilizzo. (Ho creato la proprietà description su PFFile, supponiamo che sia un String)

Problemi correlati