Les definicions de classes sumen; cada nova classe que defineixen es basa en una altra classe de la qual aquesta hereda mètodes i variables d'instància. La nova classe normalment afegeix o modifica el que hereda. Així con cal duplicar el codi heredat.
L'herència enllaça totes les classes juntes en una jerarquia d'abre amb una única classe com a arrel. Quan escribim codi que es basa en el marc de treball Foundation, la clase arrel de la qual normalment és NSObject. Cada classe (excepte una classe arrel) té una superclasse un punt més aprop a l'arrel, i qualsevol classe (inclosa l'arrel) pot ser la superclsase de qualsevol nombre de subclasses i punt més lluny de l'arrel. La Figura 2-1 il·lustra la jerarquia d'unes poques classes utilitzades en el programa de dibuixat.
Figure 2-1 Algunes Classes del Programa de Dibuixat

Aquesta figura mostra que la classe Cuadrat és una subclasse de la classe Rectangle, la classe Rectangle és una subclasse de Forma, i Forma és una subclasse de Gràfic, i Gràfic és una subclasse de NSObject. L'herència és acumulativa. Així un objecte Cuadrat té els mètodes i variables d'instància definits per Rectangle, Forma, Gràfic, i NSObject, així com aquelles definides específicament pel Cuadrat. Això és simplement per dir que un objecte Cuadrat no només és un Cuadrat, també és un Rectangle, una Forma, un Gràfic, i un NSObject.
Cada classe menys NSObjecte, pot ser vista com una especialització o una adaptació d'una altra classe. Cada subclasse succesiva posterior modifica el total acumulatiu de qual hereda. La classe Cuadrat només defineix les mínimes necessitats per transformar un Rectangle en un Cuadrat.
Quan defineixes una classe, l'enllaces a la jerarquia al declarar la seva superclasse; cada classe que crees serà la subclasse d'una altra classe (excepte que defineixis una nova classe arrel). Abundants superclasses potencias són possibles. Cocoa inclou la classe NSObject i varis marcs de treball que contenen definiciaons per més de 250 classes adicionals. Algunes són classes que pot utilitizar "sense ells" -- incorporar-les dins dels teus programa així. Altres podries voler adaptar-los a les propies necessitats definint una subclasse.
Algunes classes de marcs de treball defineixen gairebé tot el que necessites, però deixen algunes específiques per ser implementades en una subclasse. Pots així crear objecte molt sofisticats escrivint només una petita quantitat de codi, i reutilitzat el treball fet pels programadors del marc de treball.
El NSObject, és una classe arrel, no té superclasse. A Cocoa, aquesta és la base de l'herència per a totes les altres classes. Això és perqué aquesta defineix el marc de treball bàsic pels objectes d'Objective-C i les interaccions dels objectes. Aquest fa saber a les classe i instàncies de classe que hi hereden l'abilitat de comportar-se com a objectes i cooperar amb el sistema d'execució.
Un classe que no necessita heredar cap comportament especial d'una altra clase podria, no obstant, estar feta com una subclasse de la classe NSObject. Les instaàncies de la classe haurien de tenir almenys l'abilitat de comportar-se com a objectes d'Objective-C quan s'executen. Heredant aquesta abilitat de la classe NSObject és més sencill i més rendible que reinventant-lo en una nova definició de classe.
| Nota: Implementar una nova classe arrel és una tasca delicada i amb molts perills amagats. La classe ha de duplicar molt del que la classe NSObject fa, com és assignar intàncies, connectar-los a les seves classes, i identificar-los al sistema d'execució. Per aquesta raó, generalment hauries d'utilitzar la classe NSObject proporcionada amb Cocoa com a classe arrel. Per més informació, mireu la documentació del marc de treball Foundation per la classe NSObject i el protocol NSObject. |
Quan un objecte de classe crea una nova instància, el nou objecte conté no només les variables d'instància que estan definits per aquesta classe sinó també les variables d'instància definides per la seva superclasse i per la seva superclasse de la superclasse, tot recorregut fins a la classe root. Així, la variables d'instància isa definida en la classe NSObjecte serà part de cada objecte. isaconnecta cada objecte a la seva classe.
La Figura 2-2 mostra algunes de les variables d'instància que podrien estar definides en una implementació en particular del Rectangle, i d'on provenen. Fixeu-vos qu eles variables que fan a l'objecte un Rectangle s'afegides a les d'una Forma (de l'anglès Shape), i les que fan un a Forma s'afegeixen a les que el fan un Gràfic, i així continuant.
Figure 2-2 Variables d'Instància del Rectangle

Una classe no té perque declarar variables d'instància. Pot simplement definir nous mètodes i confiar en les variables d'instància que hereda, si necessita a no necessita cap variable d'instància nova. Per exemple, el Cuadrat podria no declarar cap nova variables d'instància pròpia.
Un objecte no només té accés als mètodes definits per la seva classe, sinó també als mètodes definis per la seva superclasse, i per la superclasse de la superclasse, de totes les classes recorreguent fins a l'arrel de la jerarquia. Per exemple, un objecte Cuadrat pot utilitzar mètodes definints en les classes Rectangle, Forma, Gràfic i NSObject tan com els definits en la pròpia classe.
Qualsevol classe nova que defineixis en el teu programa pot, per tant, fer ús del codi escrit en totes les classes per sota en la jerarquia. Aquest tipus de herència és el benefici més gran de la programació orientada a objectes. Quan utilitzes algunes algunes dels marcs de treball orientats a objectes proporcionats per Cocoa, els teus programes poden aprofitar-se de la funcionalitat bàsica dins de les classes del marc de treball. Només has d'afegir el codi que personalitza la funcionalitat estàndard de la teva aplicació.
Els objectes classe també hereden de classes sobre seu en la jerarquia. Però perqué no tenen variables d'instància (només fan instàncies), només hereden mètodes.
Aquesta una excepció útil a l'herència: Quan defineixes una nova classe, pots implementar un nou mètode amb el mateix nom que un definit en una classe més amunt en la jerarquia. El nou mètode sobreescriu l'original; les instàncies de la nova classe l'executen en vés de l'original, i les subclasse de la nova classe l'hereden en vés de l'original.
Per exemple, el Graphic defineix un mètode display que el Rectangle sobreescriu per definir la seva pròpia versió de display. El mètode de Graphic està disponible per tots els objectes que hereden de la classe Graphic -- però no els objectes Rectangle, que en lloc d'això executen la versió de Rectangle de display.
Encara que sobreescriure un mètode bloqueja la versió original de la que ha heredat, altres mètodes definits en la nova classe poden saltar per sobre el mètode redefinit i trobar-ne l'original (mireu "Missatges cap a self i super" per apendre'n més).
Un mètode redefinit també pot incorporar el mètode que sobreescriu. Quan es fa això, el nou mètode serveix només per ajustar o modificar el mètode que sobreescriu, més enllà de canviar-lo completament. Quan varies classes en la jerarquia defineixen el mateix mètode, però cada nova versió incorpora una versió sobreescrita, la implementació del mètode és una propagació sobre totes les classes.
Encara que un subclasse pot sobreescriure mètode heredats, no pot sobreescriure variables d'instància. Com que un objecte té memòria assignada per cada variables d'instància que hereda, no pots sobreescriure una variable heredada declarant-ne un de nova amb el mateix nom. Si ho intentes, el compilador donarà error.
Algunes classes només estan dissenyades per a que altres classes puguin heredar-hi. Aquestes classe abstractes agrupen mètodes i variables d'instància que poden utilitzar-se per un nombre de subclasses diferents dins d'una definició comuna. La classe abstracta és incompleta per ella mateixa, però conté code útil que redueix la càrrega de la implementació de les seves subclasses.
La classe NSObject és el primer exemple d'una classe abstracta. Encara que els programes sovint defineixen subclasses NSObject i utilitzen instàncies pertanyents a les subclasses, mai utilitzen instàncies formades directament de la classe NSObject. Una instància de NSObject no seria bona per res; podria ser un objecte genèric amb l'abilitat de no fer res en particular.
Les classes abstractes, sovint contenene codi que ajuda a definir la estructura d'una aplicació. Quan crees una subclasse d'aquestes classes, les instàncies de les teves noves classes encaixen fortament dins de la estructura de l'aplicació i treballen automàticament amb altres objectes.
(Com que les classes abstractes han de tenir subclasse per ser útils, de vegades també s'anomenen superclasses abstractes).