Le categorie Objective C possono avere lo stesso scopo dei tratti di Scala?

3

L'affermazione della domanda sembra poco astratta per me, quindi leggi i dettagli di seguito.

Dal momento in cui il C ++ è stato la prima scelta di linguaggio orientato agli oggetti per quasi tutto, abbiamo avuto un grosso problema di ereditarietà multipla in C ++ quando due diverse implementazioni della stessa funzione dichiarate o definite in una classe genitore (astratta o concreta) del due, vieni in una classe di bambini comuni e crei ambiguità, popolarmente conosciuta come problema dei diamanti .

C ++ ha dato una soluzione: la parola chiave "virtuale", da utilizzare specificando le classi genitore in modo che solo una copia vada alla classe figlio finale decisa in runtime invece di compilare il tempo in base a determinate regole.

Java ha cercato di risolvere questo problema fornendo un'eredità singola ed evitando completamente l'ereditarietà multipla.

Ma poi mancava una funzionalità in cui un comportamento di classe poteva essere influenzato da un po 'e che potrebbe cambiare in futuro o più comportamento potrebbe essere aggiunto ad esso e avevamo bisogno di un modo per incapsulare il comportamento, poi venne il costrutto "interfaccia" che non aveva nient'altro che dichiarazioni di metodo che ogni classe di implementazione doveva implementare a modo suo.

I protocolli nell'obiettivo C sono più o meno la stessa cosa.

Tuttavia questo approccio ha un grosso svantaggio, ed è qui che la mia domanda entra in scena.

Lo svantaggio è, se una classe ha molte sottoclassi che implementano la stessa interfaccia nello stesso modo. Lo stesso codice deve essere scritto ovunque in ogni classe.

Se erano tutte le classi, l'implementazione avrebbe potuto essere presente nella classe genitore che dà l'implementazione.

Al massimo ciò che può essere fatto è introdurre una classe con l'implementazione del metodo comune tra la classe genitore corrente e farne ereditare tutte quelle classi.

Ma questo può portare a molti bug se non eseguito correttamente in un progetto complesso.

Scala fornisce tratti che non solo fungono da interfacce ma possono aggiungere implementazioni complete per alcuni di essi che possono essere mescolati con alcune classi che lo richiedono e rimossi quando non lo sono.

Non ho visto la sintassi ma ho sentito che Ruby risolve lo stesso problema usando qualcosa chiamato come mixin.

Nel caso dell'obiettivo C, abbiamo protocolli ma hanno le stesse limitazioni delle interfacce Java.

Quindi la mia domanda è: se creo una categoria di una classe e la importi in qualsiasi sottoclasse di quella classe, la sottoclasse otterrà tutti quei metodi di implementazione? Inoltre, se lo rimuovo, sarà anche possibile rimuovere la dichiarazione di inclusione dei caratteri per una classe?

Potrei sbagliarmi in nessuna delle mie supposizioni di cui sopra, sono newbie quando si parla di progettazione OOP (e mi sono appena interessato a FP).

Gradirei anche soluzioni migliori di questa.

    
posta Amogh Talpallikar 25.01.2013 - 09:51
fonte

1 risposta

2

Importando ( #import ... ) una categoria Objective-C aggiunge i metodi definiti in quella categoria a tutte le istanze della classe su cui è stata definita la categoria. A parte i tratti che possono essere mescolati in classi in modo selettivo, una categoria estende la classe su cui è stata definita una volta per tutte.

Inoltre non puoi creare una categoria autonoma e mescolarla in più classi diverse. Una categoria è un'estensione per una classe specifica, simile come se si aggiungessero i metodi alla classe stessa.

I tratti sono come interfacce java ma con implementazione. Se un tratto può essere mescolato in una classe non dipende dal nome della classe, ma dai metodi forniti dalla classe. Se una classe ha i metodi di cui ha bisogno un tratto, il tratto può essere mescolato in quella classe.

    
risposta data 25.01.2013 - 12:22
fonte

Leggi altre domande sui tag