Domanda:
Qualcuno può spiegarmi la differenza tra categorie ed eredità in Objective C? Ho letto la voce su Wikipedia e la discussione sulle categorie e non sembra diversa dal concetto di eredità. Ho anche guardato il capitolo di un libro ma ancora non capisco. Potrebbe essere che mi manchi qualcosa di molto ovvio, quindi per favore abbiate pazienza con me.
Risposta:
Ogni domanda è lecita…vediamo se la spiegazione soddisfa…
A volte l’ereditarietà (inheritance) genera più problemi di quanti ne risolva. Tuttavia è corretto usarla quando vuoi aggiungere qualcosa ad una classe esistente che ne cambi il comportamento.
Con una categoria (category), vuoi solo che l’oggetto esistente faccia giusto quel qualcosa in più. Come già detto, se hai bisogno ad esempio di una stringa che gestisca la compressione, non hai alcun bisogno di creare una sottoclasse (subclass) della classe stringa, basta creare una categoria con metodi per la gestione della compressione. In questo modo non hai bisogno di cambiare alcun tipo di dato (sostituire NSString con qualcos’altro) già in uso.
La restrizione è che le categorie aggiungono solo metodi, non puoi aggiungere variabili ad una classe usando le categorie. Se la classe ha bisogno di più proprietà devi fare una sottoclasse (oppure usare uno storage associativo).
Le categorie sono un bel modo per aggiungere funzionalità, ed allo stesso tempo essere conformi ai principi di OOP che preferisce la composizione a dispetto dell’ereditarietà.
Le cose sono un po’ cambiate con il nuovo compilatore LLVM che permette di creare delle “classi estensioni” per aggiungere variabili, tenendolo comunque private e al sicuro da interferenze esterne.