2010-01-14 10 views
6

Perché il cacao utilizza i delegati piuttosto che l'ereditarietà?Perché il cacao utilizza i delegati piuttosto che l'ereditarietà?

+2

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

+0

Che cos'è iirc? Non ne ho sentito parlare. – Casebash

+0

iirc = se ricordo correttamente – ChristopheD

risposta

6

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

+0

Suppongo che questo sia solo il problema dell'ereditarietà vs composizione – Casebash

+0

Un buon punto sulla scrittura di un controller per più oggetti nell'interfaccia – Casebash

5

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.

+1

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

+0

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). –

+0

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. –

0
+0

Potrebbe anche essere utile inserire un commento se non si intende elaborare. Cosa succede se questi collegamenti diventano morti, come il primo? – pqsk

+0

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

Problemi correlati