2011-10-01 13 views
15

Ho una domanda sui compiti che mi ha confuso, molto male. Di seguito una breve spiegazione di una domanda.Utilizzo di protocolli C oggettivi

Immaginate di sviluppare un'applicazione che memorizza le informazioni di contatto . La rubrica può contenere molti tipi di entità, ad es. Umano essere, una società o qualsiasi altra cosa che abbia un contatto.

  • Ora, invece di esplicitamente controllare ogni tipo di oggetto scrivere un protocollo che dichiara come un oggetto deve comportarsi e con successo apparire nella rubrica.

mia comprensione e gli sforzi di rispondere a questa domanda è,

  1. Costruire un protocollo che ha metodi comuni di ogni tipo di informazioni di contatto sotto @required tag. E tutti gli altri metodi che non sono simili in contatti diversi (ad esempio il numero di fax è associato con la società ma non con la persona ...) in @optional. In fase di esecuzione è possibile verificare se un oggetto risponde a un determinato metodo utilizzando selector. Dubbio: Tuttavia, anche in questo caso si verifica esplicitamente il tipo di oggetto indirettamente, ho ragione?

  2. Il mio secondo pensiero è usare qualcosa come abstract class in java. Il che significa che le classi ereditate dalla classe astratta implementano i propri metodi astratti. Ma come un ingenuo sviluppatore iOS non so come implementarlo? e non sono sicuro se questo risolverà il mio problema. Vorrei ottenere chiarimenti se qualcuno lo sa.


lettura esterno fatto finora, per favore fatemi sapere se la risposta che sto cercando è in uno di questi link. Lo leggerò di nuovo per capire e risolvere questo :). Grazie.

  1. http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProtocols.html#//apple_ref/doc/uid/TP30001163-CH15-TPXREF144

  2. http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProtocols.html#//apple_ref/doc/uid/TP30001163-CH15-TPXREF146

  3. http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProtocols.html#//apple_ref/doc/uid/TP30001163-CH15-TPXREF149

+5

Eccellente modo di porre domande a casa. +1 per seguire http://catb.org/esr/faqs/smart-questions.html – 0x8badf00d

+0

Questo link spiega chiaramente i concetti del protocollo http://www.tutorialspoint.com/ios/ios_delegates.htm –

risposta

10

Un protocollo è la stessa cosa di un'interfaccia Java. Definisce solo i metodi che la classe dovrebbe supportare. Ecco una pagina che spiega chiaramente: http://www.otierney.net/objective-c.html#protocols

In sostanza, se si vuole fare in modo di una classe avrà un metodo phoneNumber (di accesso alla proprietà phoneNumber) si farebbe qualcosa di simile:

@protocol ContactProtocol 
-(void) phoneNumber; 
@end 

@interface Person: NSObject <ContactProtocol> { 
    ... 
} 

@interface Company: NSObject <ContactProtocol> { 
    ... 
} 

E poi in fase di compilazione (o live per xcode 4) ti dirà se hai dimenticato di aggiungere il metodo phoneNumber alle classi Person o Company.

+6

I protocolli non sono gli stessi classi astratte; sono invece analoghi alle interfacce in Java. Quando si ricava una classe da una classe astratta, si ereditano entrambi i metodi e le relative implementazioni. Con un'interfaccia, ottieni solo le dichiarazioni. Lo stesso vale per i protocolli Obj-c: quando dichiari che una classe implementa un protocollo, devi fornire le implementazioni del metodo. – Caleb

+0

Hai assolutamente ragione. Stavo pensando alle interfacce! Sto aggiornando la mia risposta. –

+0

Link to Otierney.net è al momento offline. Ecco un link alla cache di Google, non so per quanto tempo funzionerà.http://webcache.googleusercontent.com/search?q=cache:QbGm74kZa1wJ:www.otierney.net/objective-c.html+&cd=1&hl=it&ct=clnk&gl=us – kevins

4

Tuttavia, si tratta ancora di controllare esplicitamente il tipo di oggetto in modo indiretto, vero?

No, il controllo del comportamento è diverso dal tipo di controllo. È possibile inviare -respondsToSelector: a qualsiasi oggetto e, se il risultato è SÌ, è possibile inviare il messaggio indipendentemente dal tipo di oggetto. È inoltre possibile richiedere che un oggetto implementare un determinato protocollo, ancora una volta senza preoccuparsi di suo tipo effettivo:

id<SomeProtocol> foo; // foo points to any type that implements SomeProtocol 

mio secondo pensiero è quello di usare qualcosa come classe astratta in java.

Questo potrebbe funzionare, ma apparentemente non è ciò che il tuo incarico ha richiesto, giusto? Dice "... scrivi un protocollo ..."

Objective-C non fornisce un modo per rendere esplicitamente un abstract di classe come fa Java. Devi solo creare la classe, e se non vuoi che sia istanziata direttamente, puoi documentarla da qualche parte.

+0

Questa domanda non riguardava Swift, ma se è stato allora, per favore correggimi se ho torto: la tua prima risposta sarebbe: Sì, ora in Swift, il protocollo è un tipo e semplicemente tu esegui "delegate? .someMethod" mentre non sei identico a "respondsToSelector" che verrà eseguito la funzione se è impostato un delegato ... Seconda domanda: (dopo aver letto il tuo commento per la risposta accettata) in Swift poiché puoi anche fornire implementazioni predefinite a protocolli come la classe astratta. – Honey

+1

@Honey Questa risposta è precedente a Swift e dovrebbe essere letta in tale contesto. Lo stesso vale per il mio commento. E anche se la domanda e le risposte erano contemporanee con Swift, il titolo della domanda * chiaramente * dice "Objective-C" e la domanda è taggata [tag: objective-c]. – Caleb

+0

Lo so davvero, stavo solo chiedendo che è diff con Swift, ci sono risposte in questo argomento e stavo solo controllando se ero in grado di mettere tutto insieme (specialmente insieme al tuo commento sopra) correttamente. – Honey

1

Hai ... opzioni.

I metodi facoltativi sono convenienti per la persona che scrive la classe per conformarsi al protocollo, fastidiosa per la persona che fa uso del protocollo. Quindi dipende da chi stai cercando di soddisfare.

I metodi facoltativi non sono negativi come il tipo di controllo. Immagina come apparirà il codice quando accedi a un oggetto entità contattabile. Quando usi un metodo opzionale, devi avere un caso if e un altro caso. Non è così conveniente come andare avanti e assumendo che tu possa chiamare il metodo. Ma è molto più conveniente che controllare il tipo. Questo sarebbe uno se caso per ogni diverso tipo di entità (e un altro caso, che potrebbe essere un'asserzione). Inoltre, se si utilizzano metodi opzionali, le informazioni sull'entità sono incapsulate nella sua classe. Se si controlla il tipo prima di chiamare un metodo, le informazioni sul tipo di informazioni di contatto fornite da un'entità si trovano al di fuori della classe nel codice chiamante. Se si aggiorna l'entità per fornire un tipo aggiuntivo di contatto, tale miglioramento non è disponibile finché non si aggiorna il codice chiamante.

L'opzione B consente di eseguire tutti i metodi richiesti, ma offre loro la possibilità di restituire un valore che indica che non sono disponibili informazioni, ad esempio zero. Ovviamente questo significa ancora un caso in caso di controllo di un risultato nullo, è solo meno dettagliato. Una soluzione ancora migliore per questo problema è che i metodi restituiscano le raccolte di più contatti. Dopo tutto, le persone possono avere più di un numero di telefono. Quindi per indicare che un tipo di contatto non è applicabile, si restituirà semplicemente una raccolta vuota.

Lo svantaggio è che chiunque scrive la classe conforme al protocollo deve aggiungere un semplice metodo di stub che dice return nil o qualcosa del genere.