2010-05-19 12 views
8

Come in Java:come evitare i metodi della superclasse sempre sovrascritti per classe sub in obiettivo - c

Un finale classe non può essere sottoclasse. Questo è fatto per ragioni di sicurezza ed efficienza. Di conseguenza, molte delle classi della libreria standard Java sono finali, ad esempio java.lang.System e java.lang.String. Tutti i metodi in una classe finale sono implicitamente definitivi.

Come posso ottenere questo comportamento nell'obiettivo-c?

+3

non si può +++++ – Sam

+1

Che cosa si intende per sicurezza? Come si fa '' java.lang.String' essere final' migliorare la sicurezza? – JeremyP

+0

@jeremyP : g oogle "utilizzando final in java" otterrai una risposta. – Manjunath

risposta

10

Non è possibile. L'efficienza non entra in essa. Se sei preoccupato della sicurezza, non utilizzare l'obiettivo-c. Ci sarà sempre un modo per aggirare le misure che prendi.

+0

Sei sicuro di non avere tali strutture in obj-c? hai inteso che obj-c non fornisce questo tipo di sicurezza? – Manjunath

+3

Objective-C è fondamentalmente aperto: posso eseguire qualsiasi operazione in fase di runtime, aggiungere classi, rimuovere proprietà, implementare metodi di swap e persino compilare dinamicamente un nuovo codice al volo. Posso farlo a qualsiasi classe, qualsiasi proprietà, persino iVars privati ​​e qualsiasi metodo. Ora, certo, puoi usare tutte queste tecniche per aggiungere misure di sicurezza al tuo codice (sicuramente non sarebbe più efficiente). Ma le stesse misure saranno sempre disponibili per chiunque voglia aggirare le tue tecniche, quindi non è il momento ben speso. – hooleyhoop

4

Non esiste un equivalente finale in obiettivo-c. Ci sono stessi schemi che potrebbero essere una buona alternativa, vi daranno una migliore separazione, ma né le prestazioni né di sicurezza:

  1. Se si desidera solo per permettere alcuni metodi per essere sovrascritti usando delegate modello potrebbe essere una scelta migliore.
  2. Se non si desidera sottoclasse, è possibile utilizzare il modello abstract factory. Dichiarare un'interfaccia pubblica + metodi di fabbrica e nascondere le classi di implementazione concreta.
6

Come è stato detto un numero di volte, non è possibile.

Tuttavia, se si sta creando una libreria (che è l'unico caso in cui potrei vedere questo rilevante, comunque) ci sono alcuni passaggi che è possibile eseguire. Bene, uno, davvero.

Scrivi, nella documentazione della classe, che "Questa classe non è destinata alla sottoclasse." (Rif. NSIndexSet) o "non hanno la precedenza questo metodo." (rif. +[NSApplication sharedApplication].

Come un modo di spiegazione, vale la pena notare che praticamente) tutto (quello che succede in Obj-C, e che lo separa da C, accade in fase di runtime, e il runtime è, per così dire, "Right There". Qualsiasi pezzo di codice può ispezionare, mutare o pervertire il tempo di esecuzione a loro piacimento, rendendo Obj-C un linguaggio terribilmente potente; per quanto riguarda la sua struttura "meta-linguaggio".

Problemi correlati