La programacln orlenLada a ob[eLos es una Lecnlca de programacln, una forma de consLrulr sofLware que uLlllza el concepLo de ob[eLos y sus lnLeracclones para llevar a cabo el funclonamlenLo esperado en la apllcacln. or supuesLo no esLamos hablando de ob[eLos reales, slno ms blen un con[unLo de pequenas mqulnas que colaboran unas con oLras para llevar a cabo Lareas. no por casualldad, esLa Lecnlca se empez a uLlllzar en el mundo de la slmulacln. Con el Llempo, esLa Lecnlca se fue exLendlendo a oLros mblLos ba[o la promesa de hacer de la programacln algo senclllo rpldo y agradable, especlalmenLe con el auge de las apllcaclones con lnLerfaz grflca. A pesar que una de las prlnclpales preLenslones de la programacln orlenLada a ob[eLos (llamemosla CC a parLlr de ahora para abrevlar) es hacer la vlda ms fcll al programador, muchas veces esLa Lecnlca parece en prlmera lnsLancla algo a lo que solo menLes prlvllegladas pueden acceder. uesde el prlnclplo, la CC ha esLado rodeada de un amblenLe mlsLerloso y aparenLemenLe dlflcll de desenLranar, en parLe debldo a una Lermlnologla esoLerlca y exceso de Leorla. A lo largo de esLe LuLorlal vamos a ver como en realldad no es algo Lan ale[ado de nuesLro dla a dla y cmo los concepLos de base son en realldad muy senclllos.
Problema y nacimiento. A grandes males, muchas soluciones.
Ll prlmer lengua[e que formallz el concepLo de ob[eLo de clase (y por exLensln el de clase, herencla y dems esoLerlsmos que veremos ms adelanLe) fue Slmula 67. La ldea de equlparar ob[eLos reales con ob[eLos vlrLuales" fue una brlllanLe ldea que supuso el germen de la meLodologla de la CC y que faclllL el desarrollo en el mblLo de la slmulacln de evenLos dlscreLos para el que era uLlllzado Slmula. or aquel enLonces, en el ano 1968, LA C1An Lra[o conclencla sobre el problema de la calldad del sofLware, auLodenomlnada crlsls del sofLware": la programacln esL aun muy verde y aun no cumple su poLenclal al 100. or LanLo es necesarlo buscar nuevas formas de Lraba[ar, nuevas vlas que me[oren los resulLados.
A ralz de aquello comenzaron a prollferar dlsLlnLas Lecnlcas de programacln, Lecnlcas ms regladas que permlLlan resolver problemas en el desarrollo de sofLware de forma eflclenLe, como la programacln funclonal, modular, eLc... ? de forma paralela aparecleron mulLlLud de lengua[es que lmplemenLaban dlchas ldeas muchos de los cuales han sobrevlvldo a la acLualldad de una manera u oLra.
?a enLrados los 70, Alan kay, en la unlversldad de uLah conocl Slmula y enconLr en el ldeas lnLeresanLes para su proyecLo uynabook: Alan Lenla el sueno de crear el prlmer ordenador personal, orlenLado prlnclpalmenLe a la educacln, y que en muchos aspecLos se podrla conslderar un precursor concepLual del lad. Ll lnLeres de kay en Slmula venla de la necesldad de Lener un lengua[e con una fllosofla adecuada a la del proyecLo y con un aprendlza[e ms senclllo que no neceslLara de un experLo para el desarrollo de apllcaclones para su uyna8ook (su ldea es la de un elemenLo de creacln acLlva de conLenldos, no solo el consumo). Ms Larde, Alan form parLe del Learnlng 8esearch Croup de xerox A8C. LsLe grupo Lermln creando el lengua[e SmallLalk, con especlal hlncaple en los usos educaLlvos, lengua[e que forma parLe de su vlsln de la auLenLlca compuLacln personal para Lodo y Lodos. La prlmera versln publlca del lengua[e fue Small1alk-80. SmallLalk-80 slrvl de lnfluencla dlrecLa a gran canLldad de lengua[es, como hyLon, 8uby, erl, y por supuesLo Cb[ecLlve-C. una caracLerlsLlca lnLeresanLe de SmallLalk es que lleva al exLremo la fllosofla orlenLada a ob[eLos y Lodo en su lengua[e es un ob[eLo, no exlsLen los Llpos prlmlLlvos como el lnL", el double", eLc.. Se puede conslderar un lengua[e orlenLado a ob[eLos puro. Sln embargo, gran parLe de los lengua[es orlenLados a ob[eLos que le han Lomado como lnsplracln son hlbrldos: esLn basados en lengua[es procedurales como C, en el caso de Cb[ecLlve-C, lo que hace que enconLremos clerLas lncoherenclas y reducLos del pasado pre-orlenLacln a ob[eLos en casl Lodos ellos.
Ll ob[eLo es la unldad mlnlma sobre la que se consLruye un programa orlenLado a ob[eLos Lll[amos un ob[eLo al azar: por e[emplo una de esas modernas cafeLeras de cpsulas que Lan fcll nos hacen la vlda a los programadores. Sl segulmos la ldea de la equlvalencla enLre el mundo real y el mundo vlrLual llegaremos a la conclusln de que el ob[eLo cafeLera" puede ser deflnldo por una serle de aLrlbuLos y unos comporLamlenLos proplos de su condlcln con los que lnLeracLuamos mandndole mensa[es. veamos en deLalle cada uno de esLos punLos para empezar a darle un poco de senLldo a esLa exLrana comparacln.
93"1/53 : 0;#%&%
Ll ob[eLo cafeLera va a enLender dos mensa[es claros: cafe corLo" y cafe largo". Ln deLermlnado momenLo, el ob[eLo alumno" envlar uno de esos mensa[es a la mqulna. LsLa reallzar un proceso lnLerno que no nos lncumbe como degusLadores de cafe o programadores: nos es lndlferenLe que componenLes Llene la cafeLera o que pasos slgue para hacer el cafe. SlmplemenLe es una ca[a negra que expone al mundo una lnLerfaz compuesLa por 2 operaclones o meLodos, lnLerfaz que dlcLa como ha de ser uLlllzada. vamos a uLlllzar mucho la palabra lnLerfaz en esLas pglnas: podemos equlparar la lnLerfaz con el exLerlor del ob[eLo, esas cosas que podemos ver y uLlllzar de ella.
-$%<)3&/& una propledad es un aLrlbuLo proplo del ob[eLo, y que seguramenLe varle enLre ob[eLos del mlsmo Llpo. Ln el caso que nos ocupa, una propledad es el color. Ln nuesLra cafeLera, la propledad color Llene el valor ro[o". Ln oLra cafeLera esLa propledad Lendr el valor azul" o blanco" probablemenLe. Ll numero de serle de nuesLra cafeLera Lamblen es una propledad que seguramenLe varlar enLre dlsLlnLas cafeLeras y que de alguna forma la descrlbe o la hace unlca. ara acceder a esLas propledades o camblar su valor usaremos Lamblen el paso de mensa[es. ara ello dlspondremos de los, comunmenLe llamados, geLLers y seLLers (meLodos para obLener -geL- o aslgnar -seL- un valor a una propledad). ue esLa forma, sl qulsleramos (y fuera poslble) camblar la propledad color de una cafeLera sobre la marcha envlarlamos el mensa[e -seLColor en Cb[ecLlve-C como veremos ms adelanLe. 8esumlendo ambos aspecLos podrlamos deflnlr un ob[eLo (la cafeLera) como una enLldad que reune una serle de comporLamlenLos (meLodos) y aLrlbuLos (propledades), ofrecldos a oLros ob[eLos, que los puedes uLlllzar medlanLe el paso de mensa[es.
Ln el punLo anLerlor hemos hablado del ob[eLo cafeLera y de como se muesLra al exLerlor, con sus meLodos para poder ser uLlllzada y sus propledades caracLerlsLlcas. Sln embargo la cafeLera es mucho ms que eso, no confundamos el ob[eLo en con[unLo con su aparlencla (o lnLerfaz). uenLro de la cafeLera moderna Lendremos una bomba de agua, un depslLo, un calenLador, eLc... ero cuando hacemos un cafe no neceslLamos saber nada de esLo. Ls ms: sl a escondldas algulen camblara la bomba o cualqulera de los componenLes lnLernos no nos enLerarlamos slempre que el resulLado fuera un cafe corLo o largo como el que haclamos anLes.
Encapsulacin una de las caracLerlsLlcas prlnclpales de la programacln orlenLada a ob[eLos es que promueve desde la base la encapsulacln. LsLe Lermlno resume la ldea de que para uLlllzar o conocer las propledades esenclales de un ob[eLo no deberla ser necesarlo conocer o enLender el funclonamlenLos o las propledades lnLernas del mlsmo. ue la mlsma forma, sl fuera necesarlo camblar la manera en que se reallza una Larea en nuesLro ob[eLo (por e[emplo aumenLar la presln de la bomba de agua), el camblo puede hacerse sln afecLar a los ob[eLos que lo uLlllzan. }no Lenemos que volver a aprender a usar la cafeLera de nuevo solo porque algulen haya camblado algo en su lnLerlor! Ln una apllcacln orlenLada a ob[eLos, la lnLerfaz del ob[eLo funclona como una especle de resumen o carLa de presenLacln en el que aparecen meLodos y aLrlbuLos que el resLo de ob[eLos pueden uLlllzar del ob[eLo. Como vemos, el funclonamlenLo lnLerno del ob[eLo puede camblar o no, pero lo lmporLanLe es que a nosoLros, como usuarlos de ese ob[eLo, nos da lgual porque la lnLerfaz no camblar. LsLo hace poslble, enLre oLras cosas, que sea exLremadamenLe senclllo acoplar el Lraba[o de un programador que ha hecho y dlsenando un con[unLo de ob[eLos con el de oLro programador que crea oLro con[unLo de ob[eLos que usan al prlmero. Los ob[eLos de la vlda real, al lgual que los de la CC, forman [erarqulas de especlallzacln. Como slempre, es un concepLo senclllo deLrs de Lermlnos exLranos: Supongamos que Lenemos dos amlgos, que vamos a LraLar como ob[eLos. Ll prlmero es Lraba[ador de un mlnlsLerlo (es funclonarlo) y el oLro Lraba[a por cuenLa propla como plnLor. ? aunque no comparLan caracLerlsLlcas, como su Lraba[o, esL claro que ambos comparLen muchas caracLerlsLlcas en comun.
arece claro que dado que comparLen propledades (nombre y edad) asl como meLodos (Lraba[a, duerme y come) ambos perLenecen a una mlsma famllla de ob[eLos: podemos generallzarlos y conclulr que ambos son persona", dando lugar a una relacln de herencla.
Herencia Como vemos, LanLo los ob[eLos reales, como los proplos de la CC forman [erarqulas de especlallzacln.
LsLas [erarqulas las podemos ldenLlflcar fcllmenLe pregunLndonos: Ls un?". or e[emplo: Ls un funclonarlo una persona? or supuesLo que sl, de la mlsma forma que un plnLor Lamblen es una persona. LsLarlamos sln equlvocacln anLe dos relaclones de herencla. un funclonarlo es un plnLor? LvldenLemenLe aqul la respuesLa es un roLundo no, luego plnLor y funclonarlo no esLn relaclonados de forma dlrecLa por la herencla. un gaLo es un mamlfero? Sl, por LanLo el ob[eLo gaLo podrla ser un heredero especlallzado del ob[eLo mamlfero, que es ms generlco. nuesLro amlgo el plnLor o nuesLro amlgo el funclonarlo son personas especlallzadas en reallzar clerLas Lareas, y por LanLo Llenen Lodo lo proplo de una persona ms las caracLerlsLlcas proplas de su especlalldad. Ll funclonarlo ha anadldo una propledad que lndlca el numero de anos como funclonarlo, y el plnLor un meLodo que le permlLe plnLar al goLele. Cuando se esLablece una relacln de herencla, lnLernamenLe Lamblen se produce una relacln de delegacln enLre el ob[eLo hl[o y su ob[eLo padre. Cuando el ob[eLo lunclonarlo reclbe el mensa[e duerme", esLe lo redlrecclona a su ob[eLo padre de Llpo ersona, porque es una Larea propla de ser ersona.
Ll funclonarlo por sl mlsmo no enLlende ese mensa[e. Ln muchos lengua[es de programacln orlenLados a ob[eLos, el ob[eLo lnLerlor" que represenLa al padre es llamado con la palabra clave super". Sl el ob[eLo plnLor" reclbe el mensa[e goLele", no hay nlnguna redlreccln porque los ob[eLos de Llpo lnLor son los especlallzados en esa Larea.
or ulLlmo, sl le envlamos el mensa[e goLele" a !uan el funclonarlo no lo enLender y lo redlrecclonar a su ob[eLo padre, por sl el suplera lnLerpreLarlo. Como ersona no sabe nada de la operacln goLele" Lendremos un error: nunca deblmos haber mandado ese mensa[e a algulen que no lo lba a enLender, nl por ser funclonarlo nl por ser persona... Cabe pregunLarnos una ulLlma cuesLln: Cul es la lnLerfaz de !uan o Manolo? Cue muesLran al exLerlor cualqulera de ellos? La respuesLa es que su lnLerfaz esL formada por los meLodos y propledades del padre ms los meLodos y propledades que anaden. Cul es la lnLerfaz comun enLre !uan y Manolo? Los meLodos y propledades de la clase padre comun de ambas, es declr, los proplos de persona". Ln Lermlnos de CC la herencla es algo muy prcLlco porque cuando un comporLamlenLo es comparLldo por muchos Llpos de ob[eLos, esLe se puede generallzar en un solo lugar. Sl en algun momenLo neceslLamos ob[eLos que sean ms especlallzados, Lan solo Lendremos que programar las dlferenclas con respecLo a los ob[eLos que ya Lenemos hechos. LsLo nos permlLe manLener y evoluclonar la apllcacln de forma mucho ms sencllla, opLlmlzar el desarrollo (puesLo que reuLlllzamos cdlgo consLanLemenLe) y manLener el prlnclplo de encapsulacln que vlmos anLerlormenLe: no Lenemos que conocer cmo funclona lnLernamenLe la clase padre, solo exLenderla. PasLa ahora hemos vlsLo como podemos obLener clases herederas de oLra anadlendo un meLodo nuevo o una propledad. ero Lamblen es poslble crear herederos sobreescrlblendo meLodos para camblar deLermlnados comporLamlenLos del ob[eLo padre:
Sobreescritura Como vemos en la flgura anLerlor, 8enlLo es una especlallzacln de plnLor. no solo es plnLor, slno que es plnLor experLo. Ls una relacln de herencla porque se puede apllcar la regla es un": plnLor experLo slempre es plnLor. 8enlLo, como experLo que es, no anade nlngun comporLamlenLo nl propledad nueva. Sln embargo vuelve a anadlr un meLodo goLele", puesLo que para llevar a cabo esa Lecnlca de plnLado uLlllza Lecnlcas y maLerlal basLanLe ms avanzados que un plnLor normal (por eso es plnLor experLo). Ln esLe caso, cuando se le mande dlcho mensa[e, 8enlLo lo reallzar a su manera y no a la del plnLor convenclonal. Ln esLe caso no se produce nlnguna redlreccln al ob[eLo padre o super". un plnLor experLo slmplemenLe sobreescrlbe cmo funclona el meLodo goLele". La lnLerfaz slgue slendo la mlsma, pero lgualmenLe se ha producldo una relacln de herencla. PasLa ahora nos hablamos enconLrado dlsLlnLos Llpos de ob[eLos que se dlferenclaban claramenLe porque ofreclan dlsLlnLa lnLerfaz, pero por culpa" de la sobreescrlLura vemos que pueden aparecer ob[eLos que aparenLen ser lguales pero que en realldad Lraba[en de forma muy dlferenLe. LsLe comporLamlenLo reclbe el rlmbombanLe nombre de pollmorflsmo.
Polimorfismo LsLe Lermlno descrlbe la poslbllldad de varlos elemenLos de morfologla dlferenLe de mosLrarse de una mlsma forma. Ln CC descrlbe la poslbllldad que hemos descrlLo anLerlormenLe de que ba[o una mlsma aparlencla (lnLerfaz) puedan darse dlsLlnLos comporLamlenLos. Craclas a esLo podemos, por e[emplo, envlar un mlsmo mensa[e a un grupo de ob[eLos que sabemos que lo lmplemenLan sln lmporLarnos de que Llpo son: sln lmporLarnos sl son plnLores o plnLores experLos. Cada ob[eLo lo lnLerpreLar como debe y no nos debemos preocupar de nada. Ln la mayorla de los lengua[es orlenLados a ob[eLos (como !ava u Cb[ecLlve-C) los ob[eLos de aparlencla slmllar se agrupan por su Llpo, es declr, su clase.
Clase La clase es el elemenLo del lengua[e orlenLado a ob[eLos que deflne el Llpo de cada uno de los ob[eLos de nuesLra apllcacln. Se puede ver como la receLa a parLlr de la cual obLenemos los ob[eLos. Ln esLa receLa se deflnen que caracLerlsLlcas Lendrn mls ob[eLos, cuales son sus propledades y a que meLodos son capaces de responder y cmo. Ln deflnlLlva: deflnlmos el aspecLo y comporLamlenLo de los ob[eLos de un Llpo.
veamos un e[emplo: AnLes, casl de pasada, ya hemos vlsLo un e[emplo de clase cuando hemos generallzado que LanLo el funclonarlo como el plnLor eran persona". La clase ersona del dlbu[o deflne que Loda persona va a Lener los aLrlbuLos o propledades nombre" y edad", y los meLodos Lraba[a", duerme" y come". Adems la clase va a deflnlr que pasa en el ob[eLo cuando se le mandan esos mensa[es. A esLo ulLlmo lo llamamos lmplemenLacln y como hemos vlsLo, es una parLe que los oLros ob[eLos no van a conocer. Ls lmporLanLe que enLendamos blen la dlferencla enLre clase y ob[eLo (Lamblen llamado lnsLancla):
Clase es la receLa para hacer ob[eLos, y un ob[eLo es un e[emplo concreLo de esa clase: Ln las clases Lamblen se deflnen las relaclones de herencla respecLo a oLras clases:
Como es lglco, cuando dlsenamos una clase nueva especlallzada a parLlr de oLra, solo lmplemenLamos las dlferenclas respecLo a la clase padre. LsLe es el moLlvo por el que la herencla nos permlLe reaprovechar cdlgo ya exlsLenLe. La herencla de clases no es el unlco meLodo que Lenemos para agrupar ob[eLos por caracLerlsLlcas slmllares y que queremos LraLar como slmllares.
Protocolos Al lgual que las clases, los proLocolos son una herramlenLa del lengua[e que uLlllzamos para caLegorlzar clases en base a funclonalldades (meLodos) concreLas que pueden desempenar. ero al conLrarlo que las clases, los proLocolos no deflnen la lmplemenLacln de los meLodos. SlmplemenLe slrven como una especle de conLraLo al que se adhleren las clases para lndlcar que Llenen las capacldades exlgldas por el proLocolo. or e[emplo:
Ln esLe esquema, la clase ersona lmplemenLa el proLocolo 1raba[ador, que lmpllca que la clase ersona debe lmplemenLar un meLodo llamado Lraba[a". Adems LanLo !uan (funclonarlo), Manolo (plnLor), Lucla (persona) y 8enlLo (plnLor experLo) se pueden conslderar Lraba[adores". Ls declr: como la clase padre de Lodos ellos lmplemenLa esLe proLocolo Lenemos la LoLal cerLeza de que Lodos ellos responden al meLodo Lraba[a". Lso sl, graclas al pollmorflsmo puede que cada uno Lraba[e a su manera. Los proLocolos son un mecanlsmo muy comun en la CC para consegulr grupos de ob[eLos que, aun slendo de dlsLlnLas clases, respondan a deLermlnados mensa[es. Ln oLros lengua[es como !ava, un proLocolo reclbe le nombre de lnLerfaz", que es la palabra que hemos uLlllzado como slnnlmo de aparlencla: Lenemos que Lener claro que un proLocolo no lmplemenLa nada, solo es un conLraLo que dlcLa una aparlencla.
uuranLe las prxlmas pglnas vamos a llevar Lodo lo que hemos aprendldo sobre la programacln orlenLada a ob[eLos al papel. vamos a escrlblr en cdlgo los e[emplos que vlmos de forma que Lendremos la base suflclenLe de programacln orlenLada a ob[eLos en Cb[ecLlve-C para comenzar con exlLo nuesLro aprendlza[e de programacln lCS o CS x. La gran mayorla de los frameworks 1 de los enLornos de desarrollo de ambos slsLemas operaLlvos esLn basados en la programacln orlenLada a ob[eLos en Cb[ecLlve-C, lo que ha hecho de esLe lengua[e uno de los ms populares de la acLualldad 2 , a pesar de haber pasado prcLlcamenLe desaperclbldo para la gran comunldad de desarrolladores duranLe decadas. uecadas? LfecLlvamenLe Cb[eLlve-C no es un reclen llegado preclsamenLe, veamos un poco de hlsLorla.
F" <%(% &3 2)1#%$)/
Cb[ecLlve-C fue creado en los anos 80 prlnclpalmenLe por 8rad Cox y 1om Love en su companla SLepsLone. ara su desarrollo parLleron del lengua[e C (lengua[e procedural, no orlenLado a ob[eLos) como unos anos anLes harla Lamblen el creador de C++ (oLro lengua[e orlenLado a ob[eLos muy popular). La lnsplracln prlnclpal fue SmallLalk, graclas al cual vleron claramenLe que lengua[es de esLe esLllo lban a ser necesarlos para solvenLar muchos problemas de reuLlllzacln de sofLware en grandes corporaclones. ara ello crearon una exLensln al compllador de C con la que lograban anadlr las funclonalldades que le permlLlan la uLlllzacln de ob[eLos. LsLo se llam CCC (Cb[ecL-CrlenLed rogrammlng ln C). ?a en 1986 el lengua[e se presenLaba oflclalmenLe, en el llbro de Cox Cb[ecL-CrlenLed rogrammlng, An LvoluLlonary Approach". A flnales de los 80, nex1, la companla de lnformLlca orlenLada a clencla y educacln que form SLeve !obs Lras su sallda de Apple llcencl el uso de Cb[ecLlve-C de SLepSLone. A parLlr de el monLaron su proplo compllador y llbrerlas, que uLlllzarlan para el desarrollo de la lnLerfaz de usuarlo para esLaclones de Lraba[o nex1 y su
1 Dcese de un conjunto de herramientas (un entorno de desarrollo, un lenguaje) y buenas prcticas orientados a facilitar el desarrollo de un proyecto o la solucin de problemas concretos dentro del mismo
slsLema operaLlvo nex1S1L. LvenLualmenLe de[arlan de desarrollar hardware para cenLrarse en las herramlenLas de sofLware que la crlLlca habla alabado fervlenLemenLe. aralelamenLe Apple lnLenLaba sobrevlvlr, decanLndose flnalmenLe por la compra de nex1 y de su slsLema operaLlvo, y devolvlendo a SLeve !obs un puesLo en la empresa en 1996. Ll resulLado fue el proyecLo 8hapsody, que serla publlcado el verano de 2001 como Mac CS x 10.0. La mayorla del Al acLual uLlllzada por Apple en lCS y CS x esL basada en aquel cdlgo, asl como el lengua[e y las herramlenLas de desarrollo.
9/"%1 / 8/ %4$/
Como vemos, Cb[ecLlve-C es un lengua[e maduro y evoluclonado, y adems en consLanLe evolucln. 1amblen Llene sus ldloslncraclas (comparLldas con oLros lengua[es de slmllar orlgen) como la forma en que se dlsponen las clases en flcheros.
La clase or convencln, en Cb[ecLlve-C vamos a Lener un par de flcheros por cada clase de nuesLra apllcacln, ambos con el mlsmo nombre que la clase que deflnen pero con dlsLlnLas exLensln: . llchero de cabecera, con exLensln .h. Ln esLe flchero deflnlmos el aspecLo que nuesLra clase ofrece al exLerlor: sus propledades y sus meLodos. LsLe flchero va a conLener el color de la cafeLera y los dos boLones para hacer el cafe. . llchero de lmplemenLacln, con exLensln .m. Ln esLe flchero deflnlmos el funclonamlenLo lnLerno de nuesLra clase. LsLe flchero va a conLener la bomba de agua, el depslLo y dems componenLes y Lareas lnLernas de la cafeLera. Comencemos deflnlendo el aspecLo o lnLerfaz de nuesLra clase.
Interfaz de la clase. Fichero de cabecera. Ll flchero de cabecera slgue slempre esLe paLrn:
uonde nombreueLaClase se corresponde con el de la clase que deflnlmos y Claseadre el nombre de la clase desde la que heredamos. LnLre [lnLerface y [end colocaremos los nombres de meLodos y propledades que nuesLra clase proporclona a oLros ob[eLos. Ms adelanLe veremos cmo. Ln Cb[ecLlve-C slempre especlflcamos la clase padre, asl que podemos pregunLarnos: Sl esLamos deflnlendo la clase ersona, que no Lenla una clase padre, que deberemos lndlcar? Ln ese caso ponemos como clase padre nSCb[ecL. LsLa clase conLlene meLodos y funclonalldades (como Lemas de gesLln de memorla) que son necesarlas para que el enLorno de e[ecucln de Cb[ecLlve-C desempene su Lraba[o correcLamenLe. 1oda clase debe heredar de forma dlrecLa o lndlrecLa de nSCb[ecL.
[lnLerface ersona : nSCb[ecL
...
[end
or e[emplo, nuesLra clase lnLor, el flchero se llamarla lnLor.h y Lendrla la slgulenLe lnLerfaz:
[lnLerface lnLor : ersona
...
[end
? de la mlsma forma, el lnLor LxperLo Lendrla una lnLerfaz como esLa:
Ln Cb[ecLlve-C no es poslble que una clase herede de varlas oLras, la herencla slempre se produce desde una unlca clase. Ln oLros lengua[es orlenLados a ob[eLos como C++ sl que es poslble que una clase herede de varlas oLras slmulLaneamenLe, adqulrlendo la habllldad de clases poLenclalmenLe dlspares. una vez deflnlda la relacln de herencla de nuesLra clase, vamos a rellenar el lnLerlor de la lnLerfaz. Ln prlmer lugar deflnamos las propledades:
"#$%&'()('* Las propledades son los aLrlbuLos de nuesLra clase, que guardan su esLado y sus caracLerlsLlcas. Su slnLaxls es muy sencllla:
[properLy 1lpoueLaropledad nombreueLaropledad,
1lpoueLaropledad es el Llpo de daLos del que esLamos hablando, que puede ser un Llpo bslco (enLero lnL, booleano 8CCL, coma floLanLe floaL, eLc..) o una clase. or ulLlmo el nombre de la propledad. Ln el caso de ersona, Lendrlamos las slgulenLes propledades lncluldas en nuesLra lnLerfaz:
La prlmera es un enLero que va a guardar la edad del lndlvlduo. La segunda es una cadena de LexLo que va a guardar su nombre. Las cadenas de LexLo en Cb[ecLlve-C se guardan hablLualmenLe como un ob[eLo de Llpo nSSLrlng*. Como podemos ver, una propledad de un ob[eLo puede ser oLro ob[eLo, lo que nos va a dar ple para hablar de una nueva forma de relaclonar ob[eLos:
+) ,$-%$*&,&./ Sl hasLa ahora hablamos vlsLo que los ob[eLos se podlan relaclonar enLre ellos medlanLe la herencla, Lamblen enconLramos esLa forma de relacln, en la cual un ob[eLo posee a oLro y lo uLlllza de forma dlrecLa. odemos pensar en los boLones de hacer cafe de la cafeLera como sl fueran ob[eLos que perLenecen a un ob[eLo mayor, que es la cafeLera. Ln Cb[ecLlve-C esLo quedarla algo asl:
Lo cual nos va a dar la relacln enLre ob[eLos slgulenLe: Las relaclones de composlcln enLre ob[eLos nos permlLen crear ob[eLos comple[os que de oLra forma serla lmposlble obLener. LsLn especlalmenLe lnvolucrados en las esLrucLuras de daLos: por e[emplo, en Cb[ecLlve-C una llsLa (o array) es Lan solo un ob[eLo que esL compuesLo de oLros muchos, guardando un clerLo orden. Al lgual que con la herencla, Lenemos una manera rplda de ldenLlflcar una relacln de esLe Llpo: Ll prlmer ob[eLo esL compuesLo del segundo ob[eLo?: La cafeLera esL compuesLa de un boLn de cafe largo? Como la respuesLa es aflrmaLlva enLonces esLamos anLe una relacln de composlcln.
Paso de mensajes y mtodos Los meLodos, en Cb[ecLlve-C Llenen una slnLaxls muy pecullar, que hace que de prlmeras nos slnLamos un poco perdldos. ero sl comparamos la deflnlcln de una funcln en un lengua[e como C o !ava con Cb[ecLlve-C enconLraremos rpldamenLe paralellsmos:
Como vemos, la prlnclpal dlferencla enLre Cb[ecLlve-C y los lengua[es que ya conocemos es que los parmeLros esLn lnLercalados en el nombre de la funcln. C el nombre de la funcln esL lnLercalado enLre los parmeLros, sl queremos verlo asl. Ln esLe e[emplo Lenemos un meLodo que cuando flnallza no devuelve nada (su Llpo de daLo de reLorno es vold) y que reclbe dos parmeLros que se van a lndlcar el Lamano del lado mayor y menor del recLngulo.
Ls muy proplo del lengua[e que los nombres de meLodos sean muy largos, y en clerLo modo auLoexpllcaLlvos, cosa que se ve especlalmenLe blen cuando llamamos a esLos meLodos, o me[or dlcho, cuando envlamos un mensa[e a un ob[eLo:
Los mensa[es se reallzan slempre enLre corcheLes, slendo el prlmer elemenLo el ob[eLo al que queremos mandar el mensa[e y a conLlnuacln el nombre del meLodo, separando cada parLe del nombre de un parmeLro medlanLe los dos punLos (:). 1al y como declamos, en la llamada el meLodo queda auLoexpllcado y hace un cdlgo muy leglble. Ahora vamos a anadlr a la lnLerfaz de la clase ersona las deflnlclones de meLodos correspondlenLes: [lnLerface ersona : nSCb[ecL
[properLy lnL edad,
[properLy nSSLrlng *nombre,
- (vold)Lraba[a:(lnL)horas,
- (vold)duerme,
- (vold)come:(AllmenLo *)unAllmenLo,
[end
Sl a un ob[eLo ersona qulsleramos envlarle cualqulera de esLos mensa[es, lo harlamos de la slgulenLe manera:
un momenLo... La clase ersona no Llene un meLodo seLnombre en la lnLerfaz... Su clase padre Lampoco lo Llene deflnldo porque es nSCb[ecL... LnLonces, ue dnde aparece? Como dl[lmos en el aparLado sobre propledades, esLas se acceden Lamblen medlanLe mensa[es, al lgual que los meLodos. Cuando deflnlmos una propledad usando [properLy el compllador nos va a generar auLomLlcamenLe dos meLodos: - (1lpoueLaropledad)nombreueLaropledad, - (vold)seLnombreueLaropledad:(1lpoueLaropledad)nuevovalor,
Ll prlmero nos recupera el valor del aLrlbuLo y el segundo nos permlLe camblar su valor. lgual que anLes hemos camblado el nombre" del ob[eLo lucla", podemos recuperarlo medlanLe el prlmer meLodo:
nSSLrlng *unnombre = [lucla nombre],
MedlanLe esLa llamada guardamos en la varlable unnombre" el valor del aLrlbuLo nombre" del ob[eLo lucla".
La implementacin de la clase La lmplemenLacln, es declr, el funclonamlenLo lnLerno de los ob[eLos se descrlbe en el flchero de lmplemenLacln (que recordemos que Lendr un nombre del esLllo de Clase.m):
[lmplemenLaLlon nombreueLaClase
...
[end
Como vemos, aun ms senclllo que el flchero de cabecera. ara nuesLra clase =&$>%*8 Lendrlamos un flchero ersona.m con el slgulenLe conLenldo:
!"#$%"%&'()*+& -% #./#*%-(-%0 LsLe Lraba[o, como vlmos, nos lo ahorra el compllador al generarnos auLomLlcamenLe, y sln que lo veamos, los meLodos de acceso a la propledad correspondlenLes. AnLlguamenLe, para cada propledad que deflnleramos, deblamos lndlcar en el flchero de lmplemenLacln una llamada [synLheslze que generaba la lmplemenLacln de los meLodos de acceso. AcLualmenLe con deflnlr [properLy obLenemos el mlsmo efecLo.
0-%1'-'/2),&./ (' 3/ -42$($ Sln embargo, los meLodos debemos lmplemenLarlos nosoLros. La slnLaxls es muy sencllla y slgue el paLrn vlsLo en la deflnlcln del meLodo en la lnLerfaz de la clase:
Sl en la lnLerfaz Lan solo colocbamos el nombre del meLodo seguldo de un punLo y coma, en la lmplemenLacln el nombre del meLodo se conLlnua abrlendo llaves. A conLlnuacln escrlblrlamos el cdlgo en Cb[ecLlve-C que lmplemenLara el comporLamlenLo del meLodo, y flnalmenLe cerrarlamos las llaves. ue esLa manera, la lmplemenLacln de nuesLra clase ersona quedarla exacLamenLe asl:
Implementacin e interfaz de clases que heredan de otras veamos como serla la lnLerfaz de nuesLra clase lunclonarlo:
[lnLerface lunclonarlo : ersona
[properLy lnL anLlguedad,
[end
Aqul apreclamos el auLenLlco valor de la herencla: la clase lunclonarlo ya no Llene que deflnlr las propledades nombre" o edad", slno Lan solo deflnlr la herencla desde la clase padre ersona. A pesar de ello un ob[eLo lunclonarlo responder a cualquler mensa[e proplo de la clase ersona, porque es su ob[eLo padre. ue lgual manera, lnLor solo va a anadlr la deflnlcln del nuevo meLodo goLele":
Ln esLe caso, como esL anadlendo un nuevo meLodo, deber especlflcar su lmplemenLacln en su flchero correspondlenLe. Asl, lnLor.m quedarla de la slgulenLe manera:
[lmplemenLaLlon lnLor
- (vold)goLele [ nSLog(["lnLo al goLele"), }
[end
Como vemos, Lan solo escrlblmos la lmplemenLacln del nuevo meLodo. Ln esLe e[emplo uLlllzamos la funcln nSLog de Cocoa para mosLrar por consola una cadena de LexLo. Cue sucede cuando hacemos uso de la sobreescrlLura de meLodos? veamos la lnLerfaz de la clase lnLor LxperLo, que como recordaremos sobreescrlbla el meLodo goLele" de la clase lnLor:
[lnLerface lnLorLxperLo : lnLor
[end
La clase lnLor LxperLo va a Lener el mlsmo aspecLo" que la clase lnLor. no obsLanLe, va a ofrecer un nuevo funclonamlenLo del meLodo goLele" en la seccln de lmplemenLacln:
- (vold)goLele [ nSLog(["lnLo al goLele como un experLo"), }
[end
Pemos sobrescrlLo el meLodo de lnLor y ahora la cadena de LexLo que aparecerla por panLalla serla oLra. Cul ser el resulLado por consola de e[ecuLar las slgulenLes llneas de cdlgo?
Ln las dos prlmeras llneas creamos los ob[eLos Manolo" y 8enlLo". Ll proceso es Lan slmple como lanzar el mensa[e new" dlrecLamenLe a la clase. Ln las dos llneas slgulenLes llamamos al mlsmo meLodo en cada uno de los ob[eLos, con el slgulenLe resulLado por consola:
Craclas al pollmorflsmo podemos LraLar como lguales ob[eLos que en realldad Llenen un funclonamlenLo dlsLlnLo. ue hecho podrlamos hacer pasar al ob[eLo 8enlLo" como un plnLor comun y LraLarle como Lal:
? el resulLado por consola serla exacLamenLe el mlsmo vlsLo anLerlormenLe. LsLo se puede hacer porque lnLorLxperLo es un lnLor Lamblen. LsLa generallzacln se puede hacer por la relacln de herencla enLre clases. ero no es el unlco mecanlsmo como vlmos. uno de los ms uLlllzados por Cb[ecLlve-C en el desarrollo de apllcaclones CS x e lCS es el de los proLocolos.
Definicin de protocolos Como ya expllcamos, un proLocolo acLua como un conLraLo al que una clase puede adherlrse, y que lndlca que cumple con clerLas caracLerlsLlcas deflnldas en el proLocolo. un proLocolo se puede deflnlr en un flchero proplo (nombreuelroLocolo.h) o en el flchero de cabecera de una clase. Su slnLaxls es muy pareclda a la de la lnLerfaz de una clase:
[proLocol nombreuelroLocolo
...
[end
SlmplemenLe Lenemos que lndlcar el nombre que queremos darle al proLocolo y luego especlflcar los nombres de meLodos que cualquler clase que lo cumpla debe lmplemenLar. or e[emplo, nuesLro proLocolo Lraba[ador quedarla de la slgulenLe manera:
Ahora vamos a lndlcar a la clase ersona que cumple el proLocolo 1raba[ador (ya que Llene un meLodo Lraba[a" que cumple el lndlcado por el proLocolo):
[lnLerface ersona : nSCb[ecL <C$8/808D%$>
[properLy lnL edad,
[properLy nSSLrlng *nombre,
- (vold)Lraba[a:(lnL)horas,
- (vold)duerme,
- (vold)come:(nSSLrlng *)unAllmenLo,
[end
ara ello slmplemenLe lo lndlcamos, enLre < y >", los proLocolos que cumple separados por comas. Ln esLe caso solo Lenemos uno, pero ser comun ver clases que lmplemenLen dos o Lres proLocolos dlsLlnLos. Craclas a esLe mecanlsmo vamos a Lener famlllas de clases ms generlcas (un proLocolo puede ser adopLado por clases muy dlferenLes y sln relacln muLua) que podremos LraLar de forma unlflcada:
Ln las Lres prlmeras llneas creamos ob[eLos del Llpo generlco ld" (ld slmbollza un punLero a una clase de cualquler Llpo) pero que cumplen el proLocolo 1raba[ador, lo que se lndlca enLre < y >". LsLa serle de ob[eLos que hemos creado podrlan ser de cualquler clase que lmplemenLe el proLocolo (sl no fuera asl el compllador nos darla un avlso). lunclonarlo y lnLorLxperLo lo cumplen Lamblen porque heredan de ersona, asl que no es necesarlo que lo especlflquemos en su lnLerfaz. una vez creados les envlamos el mensa[e Lraba[a" con la segurldad de que Lodos los ob[eLos sabrn responder.
La programacln orlenLada a ob[eLos se basa en una serle de concepLos que uLlllzaremos recurrenLemenLe para la creacln de nuesLros programas. Como hemos vlsLo, los concepLos son, pese a lo rlmbombanLe de sus denomlnaclones, muy senclllos. or suerLe gran parLe de los elemenLos de la CC se puede equlparar con el mundo real de una forma ms o menos absLracLa, lo que nos deberla hacer ms senclllo el aprendlza[e. Ll paso de esLos conoclmlenLos al papel" es lgualmenLe senclllo en cuanLo a slnLaxls, pues es una Lraslacln dlrecLa de los concepLos vlsLos en la Leorla. La slnLaxls de Cb[ecLlve-C en prlnclplo parece rebuscada pero con el uso hablLual nos acosLumbraremos rpldamenLe y pasaremos a hacerlo Lodo de forma auLomLlca. oslblemenLe ahora mlsmo nos quede la duda y el ansla de saber cmo apllcar, en una apllcacln real, Lodos esLos conoclmlenLos. uuranLe el prxlmo curso sucedern dos cosas lmporLanLes de cara a clmenLar nuesLro conoclmlenLo de la CC:
veremos como uLlllzan Lodas esLas Lecnlcas los lngenleros de Apple en el Suk de lCS y CS x. Lmpezaremos a crear nuesLras proplas clases y experlmenLaremos por nosoLros mlsmos las venLa[as de la CC, los problemas que se nos presenLan e lremos Lenlendo una ldea ms clara de cundo uLlllzar cada elemenLo del lengua[e. }Ln unos meses verels como el esfuerzo de camblar el chlp" ha merecldo la pena!
1. Ln un bollgrafo auLomLlco, Serla una propledad el muelle lnLerno que lleva? a) Sl, es una propledad. b) no, no es una propledad. 2. La herencla lmpllca pollmorflsmo? a) no, pero el pollmorflsmo slempre esL causado por la herencla. b) no, son concepLos anLagnlcos. c) Sl, slempre. d) no necesarlamenLe. 3. Cue herramlenLa de la CC expllcarla que una ballena, pese a ser un mamlfero lgual que un elefanLe, vlva ba[o el agua? a) La encapsulacln. b) La herencla. c) Ll pollmorflsmo. d) nlnguna de las anLerlores. 4. Cul de esLos meLodos no es un seLLer o geLLer vlldo en Cb[ecLlve-C? a) -seLAlLura: b) -seLColor: c) -geLoslclon d) -color 3. Cue dlferencla clase de ob[eLo? a) Ll ob[eLo deflne las propledades y la clase los meLodos. b) La clase deflne las caracLerlsLlcas del ob[eLo y el ob[eLo les da vlda. c) Ln el ob[eLo deflnlmos la lmplemenLacln de los meLodos, en la clase la lnLerfaz.
d) Clase y ob[eLo son concepLos ldenLlcos, cada uno se usa en un conLexLo dlsLlnLo. e) nlnguna de las anLerlores es correcLa. 6. Cul es la deflnlcln de clase correcLa (en Cb[ecLlve-C) para lndlcar que nuesLra clase 8allena hereda de Mamlfero y de AnlmalMarlno? a) [lnLerface 8allena : Mamlfero, AnlmalMarlno. b) [lnLerface 8allena : nSCb[ecL <Mamlfero, AnlmalMarlno> c) Ambas son correcLas. d) nlnguna es correcLa. 7. Cul es la prlnclpal dlferencla enLre un proLocolo y una clase? a) nlnguna, ambas son lnLercamblables y equlvalenLes. b) Ll proLocolo se reflere a la lnLerfaz de un ob[eLo y clase a lnLerfaz e lmplemenLacln. c) Ll proLocolo deflne solo meLodos. d) Ll proLocolo no se puede uLlllzar como Llpo de un ob[eLo. 8. Cue fenmeno de[a de produclrse cuando sobrescrlblmos un meLodo de una clase padre en una clase hl[a? a) 8edlreccln. b) ollmorflsmo. c) Composlcln. 9. 8epresenLa en forma de [erarqula de clases el LexLo mosLrado a conLlnuacln: "un clrculo es una flgura geomeLrlca caracLerlzada por abarcar el con[unLo de punLos slLuados a una dlsLancla r de un punLo. un cuadrado es un elemenLo geomeLrlco caracLerlzado por una longlLud de lado consLanLe l en sus cuaLro lados. Ambos se pueden colocar en un punLo del plano, deflnldo por una coordenada x y una coordenada ?. La longlLud del perlmeLro del clrculo es 2**radlo, mlenLras que la del cuadrado es 4*lado. 1oda flgura Lendr un nombre proplo." Se debe lndlcar claramenLe cuales son las propledades o meLodos heredados, composlclones, herenclas, eLc. or ulLlmo, se debe lndlcar sl se deLecLa pollmorflsmo en algun punLo del esquema resulLanLe. 10. 1raduce a Cb[ecLlve-C, denLro de lo poslble, la [erarqula de ob[eLos del e[erclclo anLerlor.
1. La respuesLa correcLa es /F +% &> 7*8 #$%#)&D8D. La razn la Lenemos que buscar en la deflnlcln que hemos dado de propledad y de lmplemenLacln: el modelo de muelle, o lncluso su presencla, no es algo que afecLe de forma dlrecLa al uso que una persona har de ese boll. La persona no Llene por que conocer que el mecanlsmo auLomLlco se ha lmplemenLado con un muelle (o de cualquler oLra manera). 2. La respuesLa DF es correcLa: que haya herencla no lmpllca pollmorflsmo necesarlamenLe. La respuesLa 8F no es correcLa porque el pollmorflsmo puede aparecer, por e[emplo, al lmplemenLar dos proLocolos de dlferenLe forma, en dos clases no relaclonadas. Ll pollmorflsmo no es un concepLo conLrarlo a la herencla, son concepLos relaclonados, luego podemos descarLar /F. ? la respuesLa 1F Lampoco serla correcLa puesLo que puede haber herencla sln pollmorflsmo: p. e[. sl la clase hl[a se llmlLa a anadlr meLodos a la clase padre. 3. La respuesLa correcLa es la /F porque es la herencla la que expllca que ob[eLos que comparLen clase padre se especlallcen. 4. Ln Cb[ecLlve-C, los seLLer Llenen la slnLaxls -seLropledad:, y los geLLers - propledad, luego el unlco meLodo no vlldo es el 1F 3-&'G?'7$8. Ls lmporLanLe ver que esLo es una convencln del lengua[e, y que, por e[emplo en !ava la respuesLa al LesL serla dlferenLe. 3. Ln esLe caso la unlca respuesLa correcLa es la /F: una clase es una "receLa" que deflne como van a ser los ob[eLos de un deLermlnado Llpo. un ob[eLo no es ms que un especlmen concreLo y vlvlenLe de ese Llpo. 6. La respuesLa correcLa es DF porque Cb[ecLlve-C no admlLe la herencla mulLlple. 8allena no podrla heredar de las clases Mamlfero y AnlmalMarlno slmulLneamenLe. 7. La respuesLa correcLa es 1F: enLre oLras, una dlferencla enLre una clase y un proLocolo es que un proLocolo solo puede deflnlr meLodos. LsLe con[unLo de meLodos forman una especle de conLraLo que pueden adopLar las clases. un proLocolo no Llene relacln dlrecLa con una clase, y sl se puede uLlllzar como un Llpo de daLo para generallzar ob[eLos, como vlmos con el proLocolo 1raba[ador. 8. La respuesLa 8F es correcLa: cuando una clase hereda de oLra, al llamar a meLodos de la clase hl[a, esLa los re-dlrecclona a su ob[eLo de la clase padre (super) para ser e[ecuLados. Cuando la clase hl[a sobrescrlbe un meLodo de la
clase padre, el meLodo e[ecuLado ser el reclen deflnldo en lugar de redlrlglr hacla el que lmplemenL el padre. 9. La esLrucLura de clases del problema se podrla represenLar de la manera slgulenLe:
La clase padre es H)-7$8I&%;&'$)18, que generallza a 4J$17?% y 478D$8D%, slendo ambas flguras geomeLrlcas. La generallzacln lncluye la poslcln, que vlene represenLada por un ob[eLo =7*'%, uLlllzando 1%;#%>)1)E*. unLo es un ob[eLo que deflne dos propledades, @ e ( que lndlcan un punLo en un plano de dos dlmenslones. CLros elemenLos que generallza llguraCeomeLrlca son la propledad *%;/$& y el meLodo 3#&$J;&'$% pues Loda flgura Lendr un clculo de perlmeLro. La clase 4J$17?% anade la propledad $8D)% Llplca de un clrculo, y >%/$&>1$)/& el meLodo 3#&$J;&'$% con el calculo proplo de un clrculo. La clase 478D$8D% anade la propledad ?8D% propla de un cuadrado y >%/$&>1$)/& el meLodo #&$J;&'$% con el clculo de perlmeLro Llplco de un cuadrado. LxlsLe una relacln de pollmorflsmo enLre el Clrculo y el Cuadrado respecLo al clculo de perlmeLro: Ambas son llguraCeomeLrlca pero su meLodo 3#&$J;&'$% se comporLa de dlsLlnLa forma en cada Llpo de ob[eLo.
10. La clase unLo esL compuesLa por dos enLeros que deflnen las coordenadas:
[lnLerface unLo : nSCb[ecL
[properLy lnL x, [properLy lnL y,
[end [lmplemenLaLlon unLo
[end
llguraCeomeLrlca deflne el nombre, poslcln (un ob[eLo de Llpo unLo) y el meLodo -perlmeLro. La lmplemenLacln de -perlmeLro queda vacla pues falLa lnformacln para calcularlo. [lnLerface llguraCeomeLrlca : nSCb[ecL
Clrculo exLendlenLe a llguraCeomeLrlca anadlendo radlo y una lmplemenLacln propla de -perlmeLro (Ml es una consLanLe del lengua[e que represenLa al numero ):