Perché il cacao utilizza i delegati piuttosto che l'ereditarietà?Perché il cacao utilizza i delegati piuttosto che l'ereditarietà?
risposta
Con i delegati, è possibile avere un oggetto come delegato di molti altri oggetti. Ad esempio, puoi avere l'istanza MyController come delegato di NSTableView, NSTextField, NSWindow e qualsiasi altro oggetto che componga la tua interfaccia. Questo dà un posto compatto per mettere tutto il codice dell'interfaccia utente relativo a una sezione dell'interfaccia utente.
Se avessi fatto ciò con la creazione di sottoclassi, dovresti creare una sottoclasse da tutti gli oggetti da cui desideri le richiamate.
Inoltre, questo è un classico inheritance vs composition domanda
In generale, la creazione di una sottoclasse può essere un processo che richiede molto tempo, che richiede un sacco di lavoro di base e sovrascrive i vari metodi di modello.
Nel frattempo, l'utilizzo di un delegato consente di creare un oggetto semplice che risponde a qualche domanda specifica o reagisce in vari modi.
Ora, quando si combina questo con il dinamismo che è possibile ottenere scambiando i delegati al volo, è possibile creare un sistema robusto molto flessibile che promuova un maggiore riutilizzo del codice.
Ci sono alcune discussioni generali su queste cose here e here. È inoltre possibile trovare alcune vecchie domande SO here e here.
Come fa un modello a fare meno sforzo di creare rispetto ad una sottoclasse? D'altra parte, l'abilità di scambiare al volo potrebbe essere utile in alcune circostanze, ma non vedo perché sia necessario per Cocoa. – Casebash
Non sono nemmeno così sicuro che sia meno lavoro, ma meno livelli di ereditarietà portano a un design generalmente più semplice. La semplicità è una buona cosa (tm). –
per quanto riguarda la necessità. Niente è assolutamente necessario, è stata l'opinione dei progettisti del framework che, dati i vincoli del linguaggio, la composizione tramite la delega era la scelta di design migliore che potevano fare. Dopo aver lavorato per circa un anno sono incline ad accettare che la scelta è stata buona. Ma è stato un po 'strano per me quando sono arrivato a Cocoa da altre lingue. –
discusso a lungo qui: http://www.cocoadev.com/index.pl?ExtendsIsEvil
e Java ragazzi sanno anche questo: http://www.javaworld.com/javaworld/jw-08-2003/jw-0801-toolbox.html
Potrebbe anche essere utile inserire un commento se non si intende elaborare. Cosa succede se questi collegamenti diventano morti, come il primo? – pqsk
I delegati semplificano la personalizzazione del comportamento degli oggetti riducendo al minimo l'accoppiamento tra le classi. L'ereditarietà è definita in fase di compilazione, la delega non è limitata in questo modo e può essere eseguita in fase di runtime. – bbaassssiiee
- 1. Perché l'SDK dell'iPhone utilizza categorie, piuttosto che protocolli, per alcuni delegati?
- 2. Perché Object.defineProperty() piuttosto che this.defineProperty() (per oggetti)?
- 3. Perché tornare const razionale piuttosto che razionale
- 4. perché i metodi delegati UIPickerView non vengono chiamati anche dopo aver impostato i protocolli delegati?
- 5. Spiegare i delegati .NET
- 6. Aggiunta di un'unità alla interfaccia utilizza clausola piuttosto che la clausola di implementazione utilizza
- 7. Perché UITableView chiama i metodi delegati di UIScrollView?
- 8. Perché utilizzare "this.props.dispatch" piuttosto che "store.dispatch" direttamente in Redux?
- 9. Perché SequenceEqual accetta un compititore IEquality piuttosto che un predicato?
- 10. Perché utilizzare gli eventi per ciò che posso fare con i delegati?
- 11. Rendi privati i metodi delegati
- 12. cacao che suona un mp3
- 13. Impostare i delegati su zero sotto ARC?
- 14. Perché i framework web servono tramite FastCGI/SCGI, piuttosto che HTTP?
- 15. Perché i tipi di dati integer vanno in overflow in modo silenzioso piuttosto che generare un'eccezione
- 16. Perché int è preffered piuttosto che char (unsigned) per i piccoli numeri interi in MSP430-GCC
- 17. Perché il cast implicito implicito in float piuttosto che double quando si richiama il costruttore?
- 18. Posso importare i moduli babel-polyfill piuttosto che tutti?
- 19. Sincronizzazione del thread di cacao quando si utilizza [ALAssetsLibrary enumerateGroupsWithTypes:]
- 20. C# "OR" delegati dell'evento che restituiscono bool
- 21. Jquery che attraversa e utilizza i selettori
- 22. Perché il compilatore aggiunge un parametro aggiuntivo per i delegati quando non c'è chiusura?
- 23. Il debug di Ruby sta entrando piuttosto che scavalcando
- 24. jQuery - contenuto pari, piuttosto che il contenuto contiene
- 25. Perché è il! in Swift chiamato opzionale 'implicitamente' piuttosto che 'esplicitamente' da scartare?
- 26. prepareForSegue e delegati
- 27. Eventi e delegati. Che motivo di design?
- 28. I delegati, non riesco a capirci qualcosa
- 29. MKMapView non chiama i metodi delegati
- 30. Il programma semplice che utilizza i tubi si blocca
non so abbastanza su obj-/cacao per rispondere a questa domanda in debito (sicuramente seguiranno sicuramente ottime risposte), ma l'argomento principale è che l'utilizzo dei delegati consente l'accoppiamento "loose", quindi l'utilizzo dell'eredità (multipla) (impossibile in obj-c). – ChristopheD
Che cos'è iirc? Non ne ho sentito parlare. – Casebash
iirc = se ricordo correttamente – ChristopheD