• English
  • Català
  • Castellano
  • Galego
  • Français


Herència


La forma més fàcil per explicar quelcom nou, és començar amb quelcom conegut. Si vols descriure que es una "goleta", ajudaria si els qui t'escolten coneixen que és un "vaixell". Si vols explicar com treballa una arpa, és millor si pots asumir que la teva audiència sap que hi ha dins un piano, o ha vist tocar una guitarra, o com a mínim està familiaritzat amb la idea d'un "instrument musical".

El mateix passa si vols definir un nou tipus d'objecte; la descripció és més simple si pots començar amb un objecte que ja existeix.

Amb això en ment, els llenguatges de programació orientats a objectes et permeten que en la definició d'una classe nova et basis en una classe ja definida. La classe base s'anomena superclasse; la nova classe és la seva subclasse. La definició de la subclasse només especifica en que difereix de la superclasse; les altres coses s'agafen de la mateixa.

Res es copia de la superclasse a la subclasse. En lloca d'això, les dues classes estan connectades ja que la subclasse hereda tots els mètodes i les variables d'instància de la seva superclasse, molts com tu volen que els que us escolent entenguin de "goletes" per herencia ja que ells realment els coneixen com a vaixells. Si una definició de subclasse està buida (si no defineix cap variable d'instància o mètodes propis), les dues classes seran idèntiques (exepte pels noms) i compartiran la mateixa definició. Podria ser com explicar que un "violí" és el mateix que un "violí" (de l'anglés "fiddle" i "violin" dues paraules amb el mateix significat). A demés, la raó de declarar una subclasse no és per generar sinònims, sinó per crear quelcom com a mínim una mica diferent de la seva superclasse. Podries voler que el violí toqués "herva blava" (de l'anglés bluegrass) a demés de música classica.

Jerarquia de Classes

Qualsevol classe pot utilitzar-se com una superclasse d'una nova definició de classe. Una classe pot ser simultàniament una subclasse d'una altra classe i una superclasse de les seves pròpies subclasses. Qualsevol nombre de classes es poden enllaçar en un jerarquia d'herència, com es mostra en la Figura 1-4.

Figure 1-4 Jerarquia d'Herència

Figura 1-4 Jerarquia d'Herència

Cada jerarquia d'herència comença amb una classe arrel que no té superclasse. A partir de la classe arrel, la jerarquia es bifurca cap aball. Cada classe hereda de la seva superclasse, i a través de la seva superclasse, de totes les classe per sobre seu en la jerarquia. Cada classe hereda de la classe arrel.

Cada classe és l'acumulació de totes les definicions de classe dins la seva cadena d'herència. En l'exemple de sobre, la classe D hereda d'ambdues, de C, la seva superclasse, i de la classe arrel. Els mèmbres de la classe D té els mètodes i les variables d'instància definits en totes les tres classe -- D, C, i l'arrel.

Normalment, cada classe té només una superclasse i pot tenir un nombre ilimitat de subclasse. Tanmateix, en alguns llenguatges de programació orientació a objectes (no en Objective-C), una classe pot tenir més d'una superclasse; aquest pot heredar a través de múltiples codis. En lloc d'una jerarqua que es bifurca cap avall que mostra la Figura 1-4, la herència múltiple permet que algunes bifurcacions de la jerarquia (o de diferents jerarquies) s'uneixin.

Definició de Subclasses

Una subclasse pot definir la seva definició d'herència de la seva superclasse en tres situacions diferents:

  • Pot ampliar la definició de la classe, aquesta s'hereda per afegir nous mètodes i variables d'instància. Aquest és el motiu més comú per definir una subclasse. Les subclasses sempre afegeixen nous mètodes, i noves variables d'instància si els mètodes ho requereixen.
  • Pot modificar el comportament, s'hereda per substituir un mètode existent amb una nova versió. Això només és fa per implementar un nou mètode amb el mateix nom com del que s'hereda. La nova versió sobreescriu la versió heredada. (El mètode heredat no desapareix; és manté vàlid per la classe que la defineix i les altres classes que hi hereden).
  • Pot redefinir o extendre el comportament, s'hereda per substituir un mètode existent amb una nova versió però mantenint la versió antiga per incorporant-hi un nou mètode. Això es fà per poder enviar un missatge per executar la versió vella en el cos del nou mètode. Cada classe en un canvi d'herència pot aportar part dels comportaments dels mètodes. En la Figura 1-4, per exemple, la classe D pot sobreescriure un mètode definit en la classe C i incorporar la versió de C, mentre la versió de C incorpori una versió definida en la classe arrel.

 

Aquestes subclasses tendeixen a completar la definició de la superclasse, fent-la més específica i especialitzada. Afegeix, amb algunes modificacions, codi en vès de treure'l. Fixeu-vos que els mètodes normalment no poden ser desheredats i les variables d'instància no poden ser eliminats o sobreescrites.

íšs de l'Herència

En els exemples clàssics d'una jerarquia d'herència s'agafen les categories d'animals i la de plantes. Per exemple, hi hauria una classe corresponent a una familia d'abres de Pinacees (pi). Les seves subclasses haurien de ser Abet, Pi, Picea, Cicuta, etc, corresponent als varis gèneres que formen la família. La classe Pi ha de tenir una subclasse PiTou i una PiDur, amb PiBlanc, PiDolç com a subclasses de SoftPi, i PiPonderosa, PiJack, PiMonterrey, PiVermell com a sublasses de PiDur.

Poc sovint aquesta és una raó per programar un categoria com aquesta, però l'analogia és bona. Les subclasses tendeixen a especialitzar una superclasse o adaptar-la per un propòsit especial, moltes, com les especies especialitzant un gènere.

Hi han alguns úsos típics de l'herència:

  • Reutilitzar codi. Si dos o més classes tenen les mateixes coses en comú però només defereixen en algunes forma, els elements comuns poden posar-se en una única definició de classe que les altres classe n'heredaran. El codi comú és compartit i només és necessari implementar-lo un cop.

    Per exemple, els objectes Aixeta, Vàlvula, i Canonada, definits pel programa de modes d'ús de l'aigua, totes necessiten una connecció a un orígen d'aigua i han de ser capaços de saber l'aigua que flueix. Aquestes coses comunes poden codificar-se només un cop, en una classe que les classes Aixeta, Vàlvula i Canonada hi heredaran. Una Aixeta pot dir-se o ser un tipus de Vàlvula, potser la classe Aixeta podria heredar de Vàlvula, i hi afegeix una mica de si mateix.

  • Activar un protocol. Una classe pot declarar un nombre de mètodes que les seves subclasses esperen que s'implementin. La classe pot tenir versions buides dels mètodes, o versions amb implementacions parcials que han de ser incorporades dins els mètodes de subclasse. D'una altra manera, aquesta definició estableix un protocol que totes les seves subclasse han de seguir.

    Quan diferents classes implementen mètodes amb noms similars en un programa és millor fer ús del polimorfisme en el seu disseny. Activar un protocol que les subclasses han d'implementar ajuda a reforçar aquestes convencions.

  • Repartint funcionalitat genèrica. Un implementador pot definir una classe que conté un munt de codi general i bàsic per resoldre un problema, però no completa tots els detalls. Altres implementadors poden llavors crear subclasses per adaptar la classe genèrica a les seves necessitats específiques. Per exemple, la classe Aparell en el programa que modela l'ús de l'aigua pot definir un dispositiu genèric d'us d'aigua on les subclasses poden introduir tipus específics d'aplicacions.

    L'herència és una forma per fer quelcom o és per programar una tasca de forma més fàcil i una forma per separar els nivells d'implementació.

  • Fent lleugeres modificacions. Quan l'herència s'utilitza per repartir funcionalitat genèrica, una clase està concebuda per activar un protocol, o reutilitzar codi que altres classes estan esperant per heredar-hi. Però també pots utilitzar l'herència per modificar les classes que no estan projectades com a superclasses. Suposa, per exemple, que hi ha un objecte que vol treballar en el teu programa, però no voldries canviar una o dues coses que fa. Pots fer els canvis en una subclasse.
  • Preveient possibilitats. Les subclasses també poden ser utilitzades per treure alternatives per propòsits de testeig. Per exemple, si una classe ha estat codificada amb una interfície d'usuari particular, les interfícies alternatives poden ser introduides dins de subclasses durant la fase de disseny del projecte. Cada alternativa pot, llavors ser demostrada per usuaris potencials per ser amb la que prefereixin, Quan s'escull, la subclasse sel·leccioada pot ser reintegrada dins la seva superclasse.