Sunteți pe pagina 1din 49

Curso de OO dirigido por la introduccin de ambigedad

La herencia, ms aumento de la ambigedad

4. La herencia, ms aumento de la ambigedad


ndice 4. La herencia, ms aumento de la ambigedad............................................................103 Sobre el cap tulo....................................................................................................104 !oti"aciones.....................................................................................................104 Ob#eti"o.............................................................................................................104 Contenido...........................................................................................................104 4.1La herencia...........................................................................................................10$ 4.%&l polimor'ismo....................................................................................................10( 4.3La herencia como ta)onom a................................................................................10* 4.4Curiosidades biolgicas de la herencia so't+are..................................................10, 4.$La herencia - la e"olucin .e/ui"ocada0 del so't+are.........................................101 4.(2elegar en "e3 de heredar....................................................................................11% 4.*&l principio de sustitucin de Lis4o" ..................................................................114 4.,La e"olucin segura del so't+are.........................................................................11$ 4.1&l aporte del principio de sustitucin, la ambigedad..........................................11* 4.10Condiciones del principio de sustitucin............................................................11* 4.11Contrae#emplo de la herencia. &l cuadrado no es un rectngulo........................111 4.1%Las clases abstractas...........................................................................................1%1 4.13Las clases generales, una solucin alternati"a, pero5.......................................1%3 4.14Las clases particulares, bene'icios - problema...................................................1%( 4.1$La ambigedad, solucin al problema de la di"ersidad......................................1%( 4.1(La ambigedad es la cla"e, no la di"isin..........................................................1%* 4.1*La herencia m6ltiple...........................................................................................1%, 4.1,7pro)imacin al patrn adaptador.....................................................................130 4.11La herencia "ista desde el cdigo, un e#emplo...................................................131 4.%0&l polimor'ismo en 8a"a.....................................................................................13$ 4.%1&#ercicio..............................................................................................................14% 9na solucin..........................................................................................................143 4.%%Otro e#ercicio .....................................................................................................14( La b6s/ueda de la plasticidad, un cambio del dise:o............................................14* La solucin del rectngulo.....................................................................................1$0 ;ibliogra' a............................................................................................................1$1

103

Curso de OO dirigido por la introduccin de ambigedad

La herencia, ms aumento de la ambigedad

Sobre el captulo
Motivaciones La herencia ha sido - es un canto de sirena en los ob#etos. <uien lo escucha con o dos ingenuos se hunde con el sistema. =arece /ue la herencia es la 'uente de ahorro de cdigo, de la 'acilidad de modi'icacin - e)tensin de los programas, pero realmente es lo contrario, sal"o /ue se utilice con el papel - la 'orma adecuada. &l papel adecuado de la herencia es como medio de aumento de la ambigedad - la 'orma adecuada de uso es mediante el polimor'ismo. Objetivo &l ob#eti"o del presente cap tulo es /ue los alumnos comprendan> 1. &l concepto de herencia, su papel 'a"orable - sus papeles per#udiciales %. &l concepto de polimor'ismo 3. <ue es me#or delegar /ue heredar 4. &l principio de sustitucin de Lis4o", como 'orma segura - 6til de la herencia $. Las clases abstractas (. <ue la ambigedad es la cla"e, no la di"isin ontenido La primera parte pro'undi3a en la herencia, sus aspectos buenos - malos, recomienda /ue es pre'erible delegar /ue heredar. Se enuncia tambi?n el concepto de polimor'ismo. La segunda parte estudia con detalle el principio de sustitucin de Lis4o", sus condiciones - cmo un cuadrado no es un rectngulo, en t?rminos de la herencia so't+are. La tercera parte se dedica a las clases abstractas@ a la ambigedad como solucin de la di"ersidad -, en general, como solucin ms poderosa /ue el limitado principio de di"ide - "encers. La cuarta parte discute la herencia m6ltiple, sus e'ectos ne'astos actuales - las restricti"as condiciones donde es 'a"orable, por e#emplo, en el patrn adaptador.

104

Curso de OO dirigido por la introduccin de ambigedad

La herencia, ms aumento de la ambigedad

4.!

La herencia
La herencia es uno de los cantos de sirenas del en'o/ue de ob#etos. Se dice

mucho de sus 'a"ores - mu- poco de sus peligros. =or esta causa primero se estudiar la de'inicin - los peligros, - despu?s se "er la 'orma de obtener los 'a"ores de la herencia. 2esde el punto de "ista 'ormal, A;ooch 14B establece /ue> La herencia es una relacin entre clases donde una clase comparte la estructura o comportamiento de'inido en otra clase .herencia simple0 o en ms clases .herencia m6ltiple0. La herencia de'ine una #erar/u a Ces-unD entre clases, en la cual una subclase hereda de una o ms clases generali3adas@ una subclase t picamente especiali3a su superclase a:adiendo o rede'iniendo la estructura - el comportamiento. La Eigura 4. 1 ilustra el mecanismo de herencia simple.

herencia

a1 a2 a3 m1 m2 m3

superclase

C a1 a2 a3 a4 m1 m2 m3 m4 a1 a2 a3 subclases m1 m2 m3

"igura 4. ! La herencia

&n la Eigura 4. 1, la clase B comparte las propiedades de la clase A, pero rede'ine a2 - m2. La clase C, tambi?n, comparte los atributos de la clase A, pero a:ade las propiedades a4 - m4. Las subclases no pueden recha3ar ninguna propiedad de sus 10$

Curso de OO dirigido por la introduccin de ambigedad

La herencia, ms aumento de la ambigedad

superclases. Se acostumbra a escribir slo lo nue"o - se omiten las propiedades sin cambio. La relacin de herencia se establece desde las subclases hacia la superclase. &s decir, B - C indican e)pl citamente /ue son subclases de A en cada una de sus declaraciones. La palabra subclase slo denota /ue es una clase que hereda - la palabra superclase slo denota que es una clase de la que se hereda. La superclase - la subclase reciben tambi?n reciben otros nombres, por e#emplo> clase base - clase derivada respecti"amente. 2esde el punto de "ista del cdigo, los ob#etos de la subclase B son tambi?n ob#etos de la clase A, aun/ue dos de sus propiedades .a2, m20 tienen cualidades distintas a los ob#etos de la clase A. 2e modo seme#ante, los ob#etos de la subclase C son tambi?n ob#etos de la clase A.

4.#

$l polimor%ismo
&l polimor'ismo es una de las cualidades importantes del en'o/ue de ob#etos por

su aporte de ambigedad en el dise:o. &st asociado con el mecanismo de herencia permite /ue la operacin de'inida por una misma cabecera .signatura0 sea implementada de maneras distintas. Se denomina polimorfismo a la capacidad de una operacin para mani'estar un comportamiento di'erente dependiendo del ob#eto /ue la e#ecuta. =or e#emplo, la operacin m2 es polimr'ica por/ue su comportamiento depende de si la e#ecuta un ob#eto de la clase A o un ob#eto de la clase B. Los clientes de una operacin polimr'ica la in"ocan a tra"?s del mismo mensa#e, por e#emplo v.m2, pero el comportamiento depende del ob#eto /ue e)prese la "ariable v. 7 continuacin se muestra el pseudocdigo - resultado de una operacin /ue utili3a el ser"icio polimr'ico m2 o'recido por ob#etos de las clases 7, ; - C. v es A v O:A v:m2 declaracin de la "ariable v se asigna a la "ariable v un ob#eto de la clase A mensa#e al ob#eto asignado a v para /ue e#ecute m2

Se e#ecuta la operacin m2 de la clase A 10(

Curso de OO dirigido por la introduccin de ambigedad

La herencia, ms aumento de la ambigedad

v es A v O:C v.m2

declaracin de la "ariable v se asigna a la "ariable v un ob#eto de la clase C mensa#e al ob#eto asignado a v para /ue e#ecute m2

Se e#ecuta la operacin m2 de la clase A por/ue la clase C lo utili3a sin rede'inicin. v es A v O:B v.m2 declaracin de la "ariable v se asigna a la "ariable v un ob#eto de la clase B mensa#e al ob#eto asignado a v para /ue e#ecute m2

Se e#ecuta la operacin m2 de la clase B por/ue la clase B ha rede'inido m2. v es A v O:C v.m4 declaracin de la "ariable v se asigna a la "ariable v un ob#eto de la clase C mensa#e al ob#eto asignado a v para /ue e#ecute m2

&/ui"ocacin> La clase A carece del m?todo m2. &n principio, cual/uier operacin puede ser polimr'ica a tra"?s del mecanismo de herencia, sal"o las operaciones de creacin de ob#etos /ue por su tarea espec 'ica, no pueden ser polimr'icas. 9n constructor crea ob#etos de una clase - no de otra. !s adelante se "ol"er a tratar este tema.

4.&

La herencia como ta'onoma


2esde el punto de "ista conceptual se podr a decir /ue los ob#etos de B - C son

"ariantes de A. &sta idea permite asociar la herencia con una relacin #err/uica Ces unD. &s decir, como un instrumento de clasi'icacin, al estilo ta)onmico de las ciencias naturales. 7bundan los e#emplos /ue ilustran la herencia a tra"?s de modelos ta)onmicos> la clase perro es una subclase de la clase mam 'ero. =ero, en general, constitu-e un e#emplo poco a'ortunado. =rimero, por/ue cual/uier clasi'icacin es sub#eti"a - siempre admite ob#eciones, de manera /ue al introducir clasi'icaciones en el 10*

Curso de OO dirigido por la introduccin de ambigedad

La herencia, ms aumento de la ambigedad

so't+are se introducen 'uentes de cambio. Segundo, por/ue las clasi'icaciones usuales pueden ser contraproducentes para el sistema so't+are como sucede con el clsico e#emplo del cuadrado - el rectngulo, discutido ms adelante.

4.4

uriosidades biol(gicas de la herencia so%t)are


&l sabor biolgico del mecanismo so't+are denominado herencia se hace

e)pl cito en su propio nombre. 7lgunos lengua#es se di'erencian - le llaman ex ensi!n .Ce)tendsD0 o implemen aci!n .CimplementsD0 seg6n sea el caso. Fa- "arias curiosidades asociadas con este mecanismo. La herencia so't+are parece un mecanismo Cse)uadoD puesto /ue un descendiente puede tener "arios progenitores. Gista as , la herencia simple se corresponde con el 'enmeno biolgico denominado partenog?nesis donde un solo progenitor es capa3 de crear. Los descendientes tienen, en general, el mismo se)o /ue el progenitor. &n la prctica so't+are es una curiosidad sin trascendencia, aun/ue de "alor nemot?cnico como se "er despu?s. Otra curiosidad, pero esta "e3 cla"e, de la CherenciaD so't+are es /ue los CprogenitoresD so't+are desconocen a sus reto:os, al re"?s de la ma-or a de los humanos. &n el en'o/ue de ob#etos, las hi#as son las /ue reconocen a sus madres. La nue"a clase se declara hi#a de alguna clase -a e)istente como sucede con el p#aro cuco insertado en nido a#eno. &n otros casos los reci?n nacidos reconocen como progenitor a cual/uiera /ue est? presente en el momento de su nacimiento. Si las CmadresD so't+are tu"iesen /ue declarar a las hi#as, habr a /ue modi'icar la declaracin .cdigo0 de la madre cada "e3 /ue se creara una hi#a. =or este moti"o, la re'erencia hereditaria es de descendientes hacia ascendientes, en el so't+are de ob#etos. La CherenciaD so't+are es un re'le#o e)tremo del modelo de Lamarc4 donde se heredan los cambios somticos. &n la CherenciaD so't+are, si al progenitor .superclase0 se le /uita o cambia una propiedad todos sus descendientes pierden o cambian, inmediatamente, esa propiedad. Lamarc4 era contemporneo de 2ar+in, pero de ideas di'erentes. &sta otra curiosidad tambi?n es cla"e en el so't+are. Si la CmadreD so't+are adelga3a .se le /uita alguna propiedad0 todas las descendientes .hi#as, nietas,5 cho3nas, 50 nacidas o por nacer adelga3arn inmediatamente. &n 'in /ue, cual/uier modi'icacin 10,

Curso de OO dirigido por la introduccin de ambigedad

La herencia, ms aumento de la ambigedad

en los predecesores se re'le#ar en los 'uturos sucesores - se propagar a los H/ue -a e)istenI, hecho /ue no sucede en ninguna herencia natural. La propagacin de los cambios puede parecer una "irtud de la herencia, pero realmente es una catstro'e. &n primer lugar por/ue cual/uier clase puede ser madre de muchos descendientes sin saberlo@ no ha- re'erencia a ellos. La b6s/ueda de los descendientes es un problema laborioso, sobre todo si los es/uemas no e)isten, estn desactuali3ados o no se dispone de un medio automtico para hacerlo. &n segundo lugar, por/ue cual/uier cambio a'ecta a /uienes utili3an esa clase - locali3ar a los a'ectados es una tarea mucho ms di' cil de reali3ar. !ientras ms descendientes, ma-or ser el problema. La situacin es e/ui"alente a una epidemia de cambios - 'allos.

4.*

La herencia + la evoluci(n ,e-uivocada. del so%t)are


&l s mil biolgico inspira a usar la herencia como una " a de e"olucin del

so't+are, /ue se a#usta a las nue"as necesidades, a tra"?s de la creacin de clases hi#as /ue heredan las propiedades de las clases e)istente - las modi'ican o a:aden otras propiedades nue"as. =arece /ue la herencia permite ahorrar cdigo, no tocar lo /ue -a 'unciona, - adems, permite /ue se puedan cambiar muchas clases cambiando una sola. Son ideas atracti"as, como las sirenas. La Eigura 4. % muestra un rbol #err/uico de herencia cu-a ra 3 es la clase "adre. 2e ella deri"an las clases #i$a % e #i$a 2, /ue a su "e3 tienen hi#as> la clase &ie a % - &ie a 2, =ara compactar la 'igura, los atributos - los m?todos se han separado por comas, aun/ue cada uno debe ir escrito en una l nea, seg6n la notacin de 9!L.

101

Curso de OO dirigido por la introduccin de ambigedad

La herencia, ms aumento de la ambigedad

Madre

herencia

a1,a2,a3 m1,m2,m3 so hija de Hija1 a4 m4 Hija2 a2 m2 so hija de

Nieta1 a5, a6 m3, m5

Nieta2

m2

"igura 4. # $jemplo de herencia

&n la 'igura slo aparecen los atributos - los m?todos a:adidos o modi'icados con respecto a los predecesores. =or e#emplo, la clase #i$a % a:ade el atributo a4 - el m?todo m4. La clase #i$a 2 modi'ica el atributo a2 - el m?todo m2, - los declara para di'erenciarlos de los predecesores. La clase &ie a % a:ade los atributos a' - a(, - el m?todo m'. =ero tambi?n, modi'ica el m?todo m) de la clase "adre, es decir de su abuela. J por 6ltimo, la clase &ie a 2 modi'ica el m?todo m2 de la clase #i$a 2, su madre. La descripcin -a es con'usa.

110

Curso de OO dirigido por la introduccin de ambigedad

La herencia, ms aumento de la ambigedad

La 'acilidad /ue parece o'recer la herencia para la e"olucin del sistema so't+are se puede e"aluar en la prctica con la Eigura 4. 3, /ue se ha repetido en la Eigura 4. % por comodidad.

Madre

herencia

a1,a2,a3 m1,m2,m3 so hija de Hija1 a4 m4 Hija2 a2 m2 so hija de

Nieta1 a5, a6 m3, m5

Nieta2

m2

"igura 4. & /epetici(n de la "igura 4. #

7l "er en el cdigo la clase &ie a 2, se puede pensar /ue slo tiene la propiedad m2, pero no es as . Como esta clase es hi#a de #i$a 2, habr /ue buscar - locali3ar a la clase madre para saber /u? propiedades hereda de ella. 9na "e3 locali3ada, se sabe /ue &ie a 2 tiene la propiedad m2 .propia, por/ue rede'ine a la madre0 - la propiedad a2, seg6n la madre, #i$a 2. =ero, la historia continua. #i$a 2 es hi#a de "adre. &ntonces, &ie a 2 no est casi "ac a como parece. &ie a 2 tiene las propiedades> m2, propia@ a2 de #i$a 2 .su madre, /ue a su "e3 rede'ine a "adre, la madre de #i$a 20. J tiene tambi?n, las propiedades a%, a), m% - m) de "adre por/ue #i$a 2 no las rede'ine. &n 'in, con apenas tres clases se pudiera e)clamar> C!adre, el drama padreD, t tulo de un delicioso enredo teatral de 8ardiel =oncela. !ientras ms genealog a, ms cal"ario - ma-or probabilidad de e/ui"ocaciones. =or otra parte, si se /uiere reutili3ar alguna clase hi#a habr /ue lle"arse a la nue"a aplicacin, todas las clases antecesoras.

111

Curso de OO dirigido por la introduccin de ambigedad

La herencia, ms aumento de la ambigedad

Kesumiendo, la herencia es un potente instrumento de traba#o, pero peligroso por/ue puede ocasionar gra"es e'ectos negati"os seg6n se ha "isto. La herencia o'rece su ma-or utilidad - menor riesgo cuando se emplea para ampliar la capacidad de e)presar ambigedad del dise:o, seg6n se deri"a del principio de Lis4o". =ara otro tipo de uso es me#or delegar /ue heredar.

4.0

1elegar en ve2 de heredar


&sta idea es "ie#a en el so't+are, -a tiene ms de /uince a:os. AKumbaugh 1$B

utili3 el e#emplo de una pila - una lista, pero se puede usar el e#emplo de cliente persona. Eigura 4. 4

"ele#ar en $e% de heredar


!ersona !ersona

Cliente

Cliente

"igura 4. 4 1elegar en ve2 de heredar

9na situacin concreta puede sugerir el dise:o de la derecha .herencia0 por/ue los clientes del negocio son personas. Los ob#etos de la clase Clien e son tambi?n de la clase *ersona en "irtud de la relacin Ces unD de la clase Clien e hacia la clase *ersona. Sin embargo, para ser cliente no es imprescindible ser persona por tanto la relacin Ccliente es una personaD resulta una relacin circunstancial susceptible de cambio. !a:ana cliente puede ser una empresa o hasta un plutoniano, ahora /ue =lutn ha de#ado de ser un planeta .el eterno problema de las clasi'icaciones0.

11%

Curso de OO dirigido por la introduccin de ambigedad

La herencia, ms aumento de la ambigedad

Lo con"iene utili3ar la herencia para relacionar Clien e - *ersona por "arias ra3ones. =rimero, por/ue es pre"isible /ue cambie - cambiar, seg6n !urph-. Segundo, por/ue los cambios son ms engorrosos dadas las 'uertes ligaduras entre Clien e *ersona a causa de las propiedades /ue hereda Clien e de *ersona. Mercero, por/ue conceptualmente es una relacin temporal - la herencia e)presa una relacin permanente. La relacin de composicin de entre las clases Clien e - *ersona .una parte de persona es la situacin de cliente0 reduce los incon"enientes citados por/ue una persona siempre puede estar en la situacin de cliente, al menos de 'orma potencial. =or tanto, es una relacin ms estable, ms pr)ima a la condicin de permanencia /ue e)presa la composicin, en consecuencia, ha- menos posibilidad de cambio en la relacin. 7dems, de producirse cambios, ser an menos engorrosos por/ue la ligadura de Clien e hacia *ersona es mucho ms d?bil puesto /ue no hereda nada. &n "e3 de composicin se pudiera usar una relacin de asociacin, pero la composicin en'ati3a la pertenencia e)clusi"a del ob#eto clien e al ob#eto persona /ue lo contiene. 2e este modo se debe asegurar /ue el ob#eto clien e de un ob#eto persona no se comparta con otro ob#eto del sistema. Los lengua#es actuales no suministran esta cualidad, si se /uiere ha- /ue implementarla.

113

Curso de OO dirigido por la introduccin de ambigedad

La herencia, ms aumento de la ambigedad

4.3

$l principio de sustituci(n de Lis4ov


2espu?s del anlisis de los muchos problemas de la herencia, el principio de

sustitucin de Lis4o", 'ormulado hace casi dos d?cadas, o'rece un camino 6til con'iable para apro"echar los 'a"ores de la herencia. Literalmente el principio de'ine, en t?rminos de una sustitucin segura, cuando una subclase es un subtipo de una superclase. CSi para cada ob#eto O% de tipo + ha- un ob#eto O2 de tipo , tal /ue para todos los programas * de'inidos en t?rminos de ,, el comportamiento AinternoB de * no cambia cuando O% es sustituido por O2, entonces + es un subtipo de ,.D ALis4o" ,(B La Eigura 4. $ ilustra la aplicacin del principio. Cuando O%:+ es sustituido por O2:, ning6n ob#eto, por e#emplo :&, /ue espera a O2:, se altera si recibe a O%:+.

!rincipio de sustituci,n de -is.o$ + &N m)* m)* '1&(

&N m)*

'2&+

m)*

( es subtipo de + sii '2&+ es sustituido por '1&(, &N no cambia

"igura 4. * $jemplo de aplicaci(n del principio de sustituci(n de Lis4ov

114

Curso de OO dirigido por la introduccin de ambigedad

La herencia, ms aumento de la ambigedad

4.5

La evoluci(n segura del so%t)are


=ero lo interesante es "er el principio de sustitucin desde otra perspecti"a. La herencia permite sustituir un ob#eto por otro, es decir cambiar una tarea por otra, sin riesgo, siempre /ue las subclases sean subtipos de las superclases. Si tenemos una clase + /ue hereda de la clase ,, para usar un ob#eto de la clase +

donde/uiera /ue se espere un ob#eto de la clase ,, - /ue el sistema siga 'uncionando correctamente, la condicin es /ue + debe ser subtipo de ,. Si + no es subtipo de , no se puede asegurar cul ser la consecuencia de la sustitucin. La relacin de subtipo a tipo admite dise:ar un tipo - despu?s especiali3arlo sin alterar los " nculos del sistema con el tipo. Se 'acilita la e"olucin del sistema. =or e#emplo, primero dise:ar un tipo A pensando en una tarea general - despu?s, in"entar un subtipo B /ue particularice o especialice esa tarea. O al re"?s, dise:ar un tipo - ms tarde con"ertirlo en un subtipo de otro tipo. La relacin de subtipo a tipo 'acilita un antes - un despu?s sin da:os colaterales. Eigura 4. (

! v es A Antes 'p / v O:A v.m2 0 a1 m2

2$oluci,n
! v es A "espu1s 'p / v O:B v.m2 0 a1 m2 m2 A B

"igura 4. 0 $voluci(n del so%t)are

11$

Curso de OO dirigido por la introduccin de ambigedad

La herencia, ms aumento de la ambigedad

La Eigura 4. ( ilustra una l nea de e"olucin de un sistema so't+are. Nnicialmente, la clase * est asociada con la clase A .el atributo v es de la clase A0 - sus ob#etos utili3an el ser"icio m2, a tra"?s del mensa#e v.m2, dirigido a ob#etos de A. 2espu?s, se /uiere /ue m2 haga otra tarea, relacionada con la anterior pero distinta - se in"enta la clase B /ue rede'ine m2. Los ob#etos de la clase * pueden utili3ar este nue"o ser"icio dirigiendo el mismo mensa#e v.m% a los ob#etos de B. Si la clase B es subtipo de la clase A, entonces es segura la sustitucin de los ob#etos de la clase A por ob#etos de la clase B. &l 6nico rea#uste /ue re/uiere la operacin cliente Op es cambiar la asignacin Cv O:AD por Cv O:B-. &l comportamiento interno de un programa no cambia cuando se sustitu-e un ob#eto de un tipo por un ob#eto del subtipo. 7l programa, por e#emplo a los clientes como *, le es indi'erente uno u otro ob#eto, mantiene una relacin ambigua con los ob#etos de tipos - subtipos. =or tanto, se puede modi'icar la tarea, la 'uncin del programa, sin alterar su traba#o. 9na "e3 ms se consolida la direccin de la ambigedad como l nea de dise:o so't+are para conseguir acomodo a los cambios, para conseguir plasticidad. La Eigura 4. * ilustra la relacin de ambigedad .indi'erencia0 de * hacia A.

B a1 a2 a3 ! v es A 'p / v O:? v.m2 3 0 a1 a2 a3 m1 m2 m3 A m1 m2 m3

2 a1 a2 a3 m1 m2 m3

"igura 4. 3 /elaci(n de ambigedad 11(

Curso de OO dirigido por la introduccin de ambigedad

La herencia, ms aumento de la ambigedad

&n la 'igura 777, la relacin de * con el ser"icio m2 es ambigua por/ue se establece a tra"?s del mensa#e v.m2, /ue no le importa si "a dirigido a ob#etos de A, de B o de .. La clase * est ligada a la clase A, pero puede usar los ser"icios de todos los subtipos de A, indi'erentemente. Se podr a decir /ue * slo "e a A, los subtipos /uedan ocultos detrs del tipo. Los subtipos son los CdetallesD /ue omite la abstraccin A.

4.6

$l aporte del principio de sustituci(n, la ambigedad


&l aporte del principio de sustitucin es se:alar el lado CbuenoD de la herencia -

o'recer una 'orma segura de usarlo. =ero, cul es el lado CbuenoD de la herencia por/ue antes de estudiar el principio slo se hab an "isto lados problemticos. &l propio t tulo del principio o'rece la respuesta> el lado bueno de la herencia es su capacidad de producir elementos distintos, pero sustituibles. &s decir, la cualidad 'a"orable de la herencia es su capacidad para ele"ar la ambigedad en el dise:o - as 'acilitar el mane#o de la comple#idad descripti"a - de incertidumbre. La e"olucin, e)pansin o modi'icacin del so't+are a tra"?s de la herencia debe cumplir las condiciones del principio de sustitucin de Lis4o" para e"itar di'icultades.

4.!7

ondiciones del principio de sustituci(n


&l cumplimiento del principio de sustitucin e)ige /ue los m?todos de las clases

deri"adas deban mantener las siguientes relaciones con los m?todos de la clase base> 1. La clase deri"ada debe tener un m?todo correspondiente a cada m?todo de la clase base. &ste m?todo puede heredarse directamente de la clase base o sobrescribirse. %. Cada m?todo de la clase deri"ada /ue se corresponda a un m?todo de la clase base debe re/uerir lo mismo o menos /ue la clase base. &s decir, si se sobrescribe un m?todo heredado de la clase base, las precondiciones del m?todo deben ser ms d?biles o permisi"as /ue las del m?todo de la clase base. 2icho de otro modo, si se sobrescribe en una clase deri"ada un m?todo heredado de la clase base se debe garanti3ar /ue el nue"o m?todo 'uncione en las mismas condiciones - recibiendo los mismos argumentos /ue el 11*

Curso de OO dirigido por la introduccin de ambigedad

La herencia, ms aumento de la ambigedad

m?todo heredado. &l nue"o m?todo no puede ser ms restricti"o /ue el m?todo heredado. 3. Cada m?todo de la clase deri"ada /ue se corresponda a un m?todo de la clase base debe garanti3ar lo mismo o ms /ue la clase base. &s decir, si se sobrescribe un m?todo heredado de la clase base, las postcondiciones del m?todo de las clases deri"ada deben ser ms 'uertes o rigurosas /ue las heredadas de la clase base. 2icho de otro modo, el m?todo de la clase deri"ada no debe comprometerse a o'recer ma-ores resultados o resultados di'erentes@ slo debe comprometerse a hacer lo /ue hace el m?todo de la clase base, garanti3ando tambi?n las propiedades adicionales. =or e#emplo, si un m?todo de la clase base de"uel"e un n6mero ma-or /ue el argumento /ue recibe, un m?todo de una clase deri"ada podr a de"ol"er un n6mero primo ma-or /ue el argumento. =ero no estar a permitido /ue el m?todo de la clase deri"ada de"ol"iese un n6mero menor o igual /ue el argumento. 4. &st permitido /ue la clase deri"ada introdu3ca nue"os m?todos adicionales /ue no apare3can en la clase base. Las clases deri"adas deben garanti3ar tambi?n /ue se cumplan todas las restricciones de'inidas sobre los atributos /ue hereda de la clase base. =or e#emplo, si en la clase base se de'ine un atributo de tipo entero - se establece una restriccin para /ue el atributo sea ma-or o igual /ue cero, la clase deri"ada debe garanti3ar /ue se cumple esta restriccin - /ue el atributo en la clase deri"ada tambi?n tendr siempre un "alor ma-or o igual /ue cero. Como podemos "er, cumplir con el principio de sustitucin de Lis4o" es 'cil, siempre /ue no modi'i/uemos ni sobrescribamos los atributos - m?todos /ue las clases hi#as heredan de sus madres - nos limitemos slo a a:adir nue"os atributos - m?todos adicionales en las clases hi#as. Si necesitamos modi'icar en las clases hi#as los comportamientos heredados de sus madres, entonces cumplir con el principio de Lis4o" puede resultar ms complicado. =uede incluso, /ue al tratar de cumplir con el principio, debamos plantearnos si realmente la clase hi#a debe heredar de la clase madre.

11,

Curso de OO dirigido por la introduccin de ambigedad

La herencia, ms aumento de la ambigedad

4.!! ontraejemplo de la herencia. $l cuadrado no es un rectngulo


9n e#emplo clsico de uso peligroso de la herencia es la relacin entre cuadrado - rectngulo, anali3ada por ;arbara Lis4o" en su traba#o sobre el principio. 2esde el colegio, todos sabemos /ue un rectngulo es una 'igura geom?trica de cuatro lados iguales dos a dos. J /ue un cuadrado /es un- rectngulo con todos los lados iguales. La herencia se suele considerar como una relacin /es un-, por tanto podr a parecernos natural /ue la clase Cuadrado heredase de la clase 0ec 1n2ulo, -a /ue, al 'in - al cabo un cuadrado es un caso particular de rectngulo. La clase 0ec 1n2ulo bsicamente podr a tener un par de atributos, ancho - largo, /ue son su'icientes para de'inir el rectngulo. Luestra clase tendr a un m?todo es ablecer,ama3o /ue recibe como argumentos el ancho - el largo del rectngulo /ue /ueremos de'inir.

"igura 4. 5. lase /ectngulo

Si la clase Cuadrado hereda de la clase 0ec 1n2ulo, entonces Cuadrado tendr dos atributos, lar2o - ancho, - un m?todo es ablecer,ama3o /ue recibe como argumentos el lar2o - el ancho del cuadrado. Li los atributos ni los m?todos heredados de 0ec 1n2ulo resultan mu- 6tiles para la clase Cuadrado, -a /ue todos sabemos /ue en un cuadrado el largo - el ancho son siempre iguales. =ara poder utili3ar los atributos el m?todo heredado tendremos /ue a:adir algunas restricciones>

111

Curso de OO dirigido por la introduccin de ambigedad

La herencia, ms aumento de la ambigedad

1. el atributo lar2o tendr siempre el mismo "alor /ue el atributo ancho. %. el m?todo es ablecer,ama3o tendr como precondicin /ue el "alor del argumento ancho sea igual al "alor del argumento lar2o. &n caso contrario se lan3ar una e)cepcin o un mensa#e de error.

"igura 4. 6 /elaci(n de herencia entre cuadrado + rectngulo

=regunt?monos ahora /ue ocurrir a si sustituimos la clase 0ec 1n2ulo por la clase Cuadrado en alg6n lugar del cdigo donde se use 0ec 1n2ulo. O=odr a un cliente de 0ec 1n2ulo traba#ar con Cuadrado - seguir 'uncionandoP La respuesta es no. 7 menos /ue el cliente cono3ca - cumpla las restricciones de Cuadrado, si tratamos de sustituir Cuadrado por 0ec 1n2ulo el resultado ser impredecible. O<u? es lo /ue est ocurriendo en t?rminos del principio de sustitucin de Lis4o"P &l principio no se cumple por/ue los atributos - m?todos de Cuadrado son ms restricti"os /ue los de 0ec 1n2ulo. Cuadrado no es subtipo de 0ec 1n2ulo. =or tanto, si no /ueremos tener resultados inesperados no deber amos utili3ar la herencia de Cuadrado a 0ec 1n2ulo. #erencia /ue, por otra parte, no aporta ninguna "enta#a al dise:o, -a /ue Cuadrado necesita sobrescribir todo lo /ue hereda de 0ec 1n2ulo para 'uncionar. 1%0

Curso de OO dirigido por la introduccin de ambigedad

La herencia, ms aumento de la ambigedad

Luestra intuicin nos ha lle"ado a pensar /ue Cuadrado deber a heredar de 0ec 1n2ulo por/ue conceptualmente un cuadrado es un rectngulo. Sin embargo, hemos "isto /ue esta clasi'icacin, a pesar de ser cierta, no aporta ninguna "enta#a a nuestro dise:o - s puede traernos serios incon"enientes. La herencia puede ser contradictoria con la clasi'icacin usual. &n los dise:os orientados a ob#etos, copiar la realidad o de#arse arrastrar por ella, no siempre es una buena idea. 9n cuadrado es un rectngulo en geometr a, pero la clase Cuadrado no es un subtipo de la clase 0ec 1n2ulo en el so't+are.

4.!# Las clases abstractas


&l e#emplo del cuadrado - el rectngulo demuestra /ue la relacin geom?trica de tipo - subtipo entre rectngulo - cuadrado no es aplicable a una relacin so't+are entre la clase 0ec 1n2ulo - la clase Cuadrado. &l uni"erso so't+are - el uni"erso a#eno al so't+are son uni"ersos distintos. &n el uni"erso so't+are, si se /uiere conseguir el intercambio seguro de ob#etos cuadrados - ob#etos rectngulos, ha- /ue apro"echar la relacin tipo Q subtipo, pero de otra 'orma> de'iniendo a las clases Cuadrado - 0ec 1n2ulo como subtipos .hermanos0 de un tipo /ue se podr a denominar 4i2ura. &n la Eigura 4. 10 se muestra esta relacin, ampliada con la clase *aralelo2ramo .el CsupertipoD geom?trico de rectngulo cuadrado, a/u obligado a ser un subtipo ms0.

1%1

Curso de OO dirigido por la introduccin de ambigedad

La herencia, ms aumento de la ambigedad

4i#ura color pintar ampliar mo$er 5rea

!aralelo#ramo Cuadrado ! lar#o pintar ampliar mo$er 5rea 6ect5n#ulo p lar#o ancho pintar ampliar mo$er 5rea p lar#o ancho 5n#ulo pintar ampliar mo$er 5rea

"igura 4. !7 8na relaci(n prudente entre las clases Cuadrado, Rectngulo + Paralelogramo

La relacin de la Eigura 4. 10 permite el uso intercambiable de ob#etos cuadrado, rectngulo - paralelogramo por/ue todos son subtipos de un tipo. La di'icultad de la relacin es la de'inicin del cdigo de los m?todos del tipo 4i2ura. =ero el en'o/ue de ob#etos sal"a esta di'icultad, dando otro paso ms en su capacidad de e)presar ambigedad> permite /ue los m?todos del tipo sean slo nombres, nada de cdigo interior. &s decir, /ue sean una abstraccin de los m?todos homnimos de los subtipos. &ste hecho da lugar a las siguientes de'iniciones> Se denomina m5 odo abs rac o al m?todo /ue slo e)presa la cabecera - carece de cdigo interno. 2icho de otro modo, un m?todo /ue est declarado pero no implementado A;ooch 14B. =or e#emplo, los m?todos pin ar, mover, ampliar 1rea, de la clase 4i2ura. Mambi?n se les llama m5 odos vir uales o diferidos. &n 9!L los m?todos abstractos se escriben con letra cursi"a. &n el presente te)to, la letra cursi"a tiene el ob#eti"o de resaltar, no indica abstraccin. Se denomina clase abs rac a a la clase /ue contiene al menos un m?todo abstracto por/ue re'le#a la abstraccin de ese m?todo. =or e#emplo, la clase 4i2ura. Mambi?n se les llama clases vir uales o diferidas. !ientras /ue una clase es la de'inicin de un con#unto de ob#etos, una clase abstracta es la de'inicin de 1%%

Curso de OO dirigido por la introduccin de ambigedad

La herencia, ms aumento de la ambigedad

un con#unto de clases. &s una abstraccin de abstracciones /ue ele"a la capacidad de e)presar ambigedad del en'o/ue estructurado. La carencia de cdigo, en al menos un m?todo, impide /ue e)istan ob#etos de una clase abstracta. &n 9!L las clases abstractas se escriben con letra cursi"a. &n 9!L se denomina in erfa6 a una coleccin de operaciones /ue tiene un nombre - /ue se usa para especi'icar un ser"icio de una clase. &s un paso ms ele"ado en el camino de la ambigedad en 'orma de abstraccin. 9na in erfa6 carece de atributos. 9!L real3a la importancia de este tipo de abstraccin al darle un nombre propio, pero la idea es anterior - coincide con la idea de clase abs rac a pura /ue utili3an otros autores. &l problema de usar el nombre de in erfa6 es /ue aumenta la polisemia de esta palabra. Erecuentemente se utili3a la palabra inglesa Cinter'aceD como si 'uese espa:ola. =ero la traduccin de la palabra inglesa es inter'a3, puesto /ue C'aceD signi'ica cara, 'a3. =or cierto, como la palabra 'a3 es 'emenina, la palabra inter'a3 tambi?n es 'emenina - debe ser precedida por el art culo ClaD. La clase 4i2ura contiene solo el atributo color@ prescinde de otros atributos /ue pueden ser comprometedores .restricti"os0, por e#emplo, p .posicin0 - lar2o. Si se coloca el atributo lar2o, la clase 4i2ura se compromete slo con 'iguras geom?tricas /ue tengan algo recto, para /ue se pueda de'inir lar2o. &l atributo p .posicin0 parece ms uni"ersal por/ue cual/uier 'igura geom?trica en la pantalla debe tener una posicin. &s cierto, pero el punto de la 'igura /ue determina la posicin puede tomar distintos nombres, por e#emplo C"?rtice superior i3/uierdoD en los paralelogramos - similares, CcentroD en los c rculos. =ara 'acilitar /ue la clase Eigura sea el tipo de todas las clases de 'iguras con"iene prescindir de atributos restricti"os, con"iene ele"ar su capacidad de e)presar ambigedad.

4.!& Las clases generales, una soluci(n alternativa, pero9


9na solucin alternati"a al problema de los cuadrados - rectngulos es apro"echar la clase 0ec 1n2ulo para /ue tambi?n opere con cuadrados, pero como rectngulos, sin distinguirlos. La clase 0ec 1n2ulo no di'erencia entre cuadrados rectngulos, pero los humanos podr an hacerlo. Con una sola clase se ha resuelto el problema de los cuadrados - los rectngulos. 1%3

Curso de OO dirigido por la introduccin de ambigedad

La herencia, ms aumento de la ambigedad

La solucin anterior se puede e)tender a la clase *aralelo2ramo - ahorrarse la clase 0ec 1n2ulo. 7hora, una sola clase sir"e para resol"er tres problemas> el cuadrado, el rectngulo - el paralelogramo, /ue son casos particulares unos de otros desde el punto de "ista de la geometr a. Eigura 4. 11

5n#ulo ancho lar#o !

Cuadrado

6ect5n#ulo

!aralelo#ramo

4i#ura7
"igura 4. !! :enerali2aci(n de una clase

9n paso ms all conduce a la clase pol gono irregular .por /u? limitarse al regular0 /ue se consigue con rea#ustes de atributos - m?todos .cada "e3 ms generales0. J continuando con la tentacin .para /u? tantas clases0, se podr a disponer de una 6nica clase 4i2ura7 .para distinguirla de la otra0 capa3 de operar con cual/uier 'igura geom?trica. La Eigura 4. 11 ilustra un posible proceso de generali3acin /ue conduce a la clase 4i2ura7. Se ha cambiado la disposicin usual para real3ar el aumento de los atributos a medida /ue la clase aumenta en generalidad. La con'usin /ue produce la 'igura es un e'ecto colateral, /ue tambi?n se produce cuando se traba#a con clases generales.

1%4

Curso de OO dirigido por la introduccin de ambigedad

La herencia, ms aumento de la ambigedad

=ero, Opara /u? todo en una sola claseP 9na sola clase no es necesariamente ms simple /ue "arias clases. La comple#idad no se reduce por empa/uetarla en un solo elemento. Reneralmente sucede al re"?s. La comple#idad de la clase 4i2ura7 es ma-or /ue la comple#idad total de las clases separadas - adems es ms embara3osa de mane#ar. =or e#emplo, para /ue la clase 0ec 1n2ulo opere con cuadrados ha- /ue darle un "alor al atributo ancho imprescindible para la clase, pero innecesario para el humano. La clase *aralelo2ramo e)igir a adems, el ngulo. Otra "ariante ser a de'inir los atributos de 0ec 1n2ulo en t?rminos de los "?rtices de la diagonal - el m?todo pin ar, de la clase 0ec 1n2ulo, pintar a la 'igura inscrita en esos "?rtices, sin distinguir cuadrado de rectngulo. La responsabilidad de distinguir se traspasa a la persona, cliente de la clase 0ec 1n2ulo, /ue debe calcular las coordenadas del otro "?rtice, tanto para el rectngulo como para el cuadrado. Si se e/ui"oca en la operacin de clculo la 'igura sale mal. La situacin es peor si la clase *aralelo2ramo se utili3a tambi?n para cuadrados - rectngulos. Lo obstante, puede ser 6til disponer de una clase donde la 'igura se describa a tra"?s de "?rtices o puntos. Com6nmente, mientras ma-or sea la generalidad de la clase /ue reali3a la tarea, ms se complica su desarrollo, mantenimiento, manipulacin, en 'in todo. &l desarrollo progresi"o de una clase como 4i2uraS signi'ica modi'icar una - otra "e3 el interior de la clase - a /uienes usan la clase. &l desarrollo de una "e3 obliga a en'rentarse a un problema ma-or /ue el problema de en'rentarse cada "e3 con una 'igura simple. &l mantenimiento para corregir - per'eccionar una clase como 4i2ura7 aborda un mecanismo ms comple#o montado en una sola pie3a donde todo est relacionado con todo. 2e la manipulacin -a se ha hablado. =recisa in'ormacin redundante cuando opera con casos particulares ms simples, muchas "eces e)ige traba#o e)tra de /uienes usan la clase - por estas dos causas es ms susceptible a e/ui"ocaciones. La clase 4i2ura7 es una clase concreta /ue implementa una herramienta general. &s como una piedra /ue sir"e para cla"ar, cortar, lan3ar, dibu#ar, cal3ar,5 seg6n se use. Fa- /ue soportar un peso innecesario cuando se usa para cortar - ha- /ue tener cuidado de no cortarse, al usar la piedra para cla"ar. 7dems, cuando se trate de me#orar alguno de sus usos, se puede per#udicar otro por/ue todos ellos estn mu1%$

Curso de OO dirigido por la introduccin de ambigedad

La herencia, ms aumento de la ambigedad

ligados, en la misma piedra. Los humanos 'ueron especiali3ando los distintos usos de la piedra en instrumentos particulares. Mambi?n con"iene hacerlo en el so't+are.

4.!4 Las clases particulares, bene%icios + problema


Los instrumentos particulares slo e)igen la in'ormacin espec 'ica /ue necesitan@ 'acilitan el desarrollo por/ue se pueden construir - probar uno a uno, o al un sono distribu-endo el traba#o de desarrollo de los distintos instrumentos@ se puede modi'icar cual/uiera de ellos sin a'ectar a los restantes. Nncluso, se puede llegar a construir un instrumento mu- general, como 4i2ura7, para resol"er situaciones mugenerales, pero como un instrumento ms de uso espec 'ico en esas situaciones. Sin embargo, a "eces todas estas "enta#as /uedan opacadas por el problema de la di"ersidad. Sucede con 'recuencia en el so't+are.

4.!* La ambigedad, soluci(n al problema de la diversidad


&l en'o/ue de ob#etos 'acilita la resolucin del problema de la di"ersidad a tra"?s de sus recursos para e)presar - mane#ar ambigedad. La clase 4i2ura es una abstraccin /ue oculta u omite la di"ersidad .las clases0 pero /ue "iabili3a el acceso a esa di"ersidad. Eigura 4. 1%

cliente

cliente

4i#ura

4i#ura7
93, 3,3 81, 1,92, 2,

Herramienta #eneral Herramientas especiali%adas

"igura 4. !# ontraste entre soluciones

1%(

Curso de OO dirigido por la introduccin de ambigedad

La herencia, ms aumento de la ambigedad

La Eigura 4. 1% contrasta del dise:o de 4i2ura - sus subtipos con el dise:o de la clase 4i2ura7. 7mbos dise:os muestran una cara uni'orme a sus elementos clientes. &l primero por ser una abstraccin - el segundo por ser una implementacin de una herramienta general. La cara de la abstraccin es simple por/ue no se compromete con los detalles, muestra slo la esencia. La cara de 4i2ura7 es comple#a por/ue tiene /ue e)presar toda la in'ormacin /ue necesita para resol"er un problema comple#o> ocuparse de .casi0 cual/uier 'igura. La clase 4i2ura es el conte)to /ue permite dirigir la tarea al ob#eto de clase encargada de una 'igura espec 'ica. &l ob#eto de la clase 4i2ura7 es el encargado de reali3ar la tarea, cual/uiera /ue sea la 'igura. La clase 4i2ura es una abstraccin, mientras /ue la clase 4i2ura7 es un elemento concreto, particular, aun/ue implemente un mecanismo general.

4.!0 La ambigedad es la clave, no la divisi(n


&l contraste de ambos dise:os puede sugerir /ue los bene'icios de 4i2ura - sus subtipos deri"a de aplicar el principio de di"ide - "encers o de su "ersin so't+are> modulari3ar. =ero no es as , ni tampoco est asociado con cohesin - acoplamiento. La simpli'icacin se obtiene mediante la especi'icidad - la introduccin de ambigedad. La clase 4i2ura7 es un mdulo cohesi"o con ba#o acoplamiento. &s un mdulo bien dise:ado. Su di"isin en partes ms pe/ue:as no dar a lugar a los subtipos por/ue la di"isin de un mecanismo general en tro3os no produce mecanismos particulares. Nncluso, la propia clase 4i2ura7 podr a ser un subtipo ms de Eigura. Coe)istir a el supuesto todo - las partes al mismo tiempo. La 'uente de los subtipos es la especi'icidad, lo indi"idual - particular de cada 'igura, /ue e)iste posiblemente antes de lo general de cual/uier 'igura. &l cuadrado, el c rculo - el tringulo e)istieron como concepto antes /ue el concepto general de 'igura. La 'uente de la clase 4i2ura es la abstraccin, la e)presin de lo com6n a todas las 'iguras del sistema so't+are. La introduccin de este elemento ambiguo es la decisin de dise:o /ue permite homogenei3ar la di"ersidad, disponer de un acceso com6n a todas las clases particulares. La ambigedad /ue e)presa la abstraccin simpli'ica la comple#idad descripti"a por/ue reduce la cantidad de elementos /ue se necesitan para describir el dise:o. La 1%*

Curso de OO dirigido por la introduccin de ambigedad

La herencia, ms aumento de la ambigedad

e)istencia de la clase 4i2ura describe /ue el sistema se ocupa de 'iguras. Sin esta clase habr a /ue decir /ue el sistema se ocupa de cuadrados, rectngulos, 5 7dems, la ambigedad simpli'ica tambi?n la comple#idad de incertidumbre por/ue simpli'ica el traba#o de rea#uste presente - 'uturo del sistema.

4.!3 La herencia m;ltiple


Fasta ahora se ha estudiado la herencia simple de un solo progenitor .partenogen?tica0, pero tambi?n e)iste la herencia de "arios progenitores. Se denomina herencia m8l iple a la herencia donde una subclase tiene ms de una superclase directa. La Eigura 4. 13 ilustra la herencia m6ltiple.

A a ma

B b mb

C a b ma mb

"igura 4. !& <erencia m;ltiple

Faciendo un gui:o a la biolog a, la herencia es como una reproduccin se)uada donde cada progenitor aporta sus cualidades a los hi#os. &n el caso del modelo orientado a ob#etos los hi#os heredan el contenido completo sus progenitores. =or e#emplo, re'iri?ndonos a la Eigura 4. 13, la clase C hereda todos los atributos - m?todos de la clase A -, tambi?n, todos los atributos - m?todos de la clase B. 7lgunos te)tos utili3an este mecanismo para obtener elementos so't+are h bridos. Otros, como recurso de clasi'icacin mi)ta. =ero, si la herencia simple es 1%,

Curso de OO dirigido por la introduccin de ambigedad

La herencia, ms aumento de la ambigedad

peligrosa, la herencia m6ltiple es m6ltiplemente peligrosa. =or e#emplo, a menudo se ilustra la herencia m6ltiple a tra"?s de las superclases Barco - Au om!vil para obtener la clase Anfibio. 9n problema es la distorsin del su#eto /ue se pretende representar por/ue el an'ibio es barco cuando est en el agua - autom"il cuando est en tierra, mientras /ue la clase Anfibio es Barco - Au om!vil a la "e3 por/ue la herencia es un mecanismo esttico .en tiempo de compilacin0. Si el mecanismo hereditario 'uese dinmico, en tiempo de e#ecucin, un ob#eto pudiera ser de una clase ahora - de otra despu?s. Lo habr a con'usiones por/ue no ser a de dos clases en el mismo momento. 7un/ue los lengua#es comerciales de programacin orientada a ob#etos toda" a no incorporan una herencia dinmica, es posible conseguir e'ectos seme#antes con algunas t?cnicas, re'eridas por AEo+ler 1*B. Otro problema es solapamiento del contenido Cgen?ticoD heredado. =or e#emplo, la Eigura 4. 14 muestra el resultado de la herencia m6ltiple de las clases 9allina ,ibur!n para conseguir una clase con propiedades de correr - nadar.

:allina boca correr

+ibur,n boca nadar

:allir,n boca boca correr nadar

"igura 4. !4 <erencia m;ltiple con problema.

La di'icultad de la clase 9allir!n est en el atributo boca por/ue tiene dos especi'icaciones distintas. 9na manera de resol"er el solapamiento gen?tico es con la herencia dinmica. Otra, ser a poder CmarcarD la propiedad /ue se desea heredar, pero no est permitido en los lengua#es comerciales actuales. 9na tercera manera de e"itar el solapamiento es e"itar /ue las superclases aporten elementos en posible con'licto. 1%1

Curso de OO dirigido por la introduccin de ambigedad

La herencia, ms aumento de la ambigedad

&l lengua#e 8a"a adopta esta 6ltima solucin de 'orma radical. Slo permite la herencia m6ltiple de las denominadas in erfaces .clases abstractas puras /ue contienen por/ue suprime los atributos - reduce las operaciones a simples declaraciones. La implementacin de las operaciones, en clase /ue hereda, resuel"e las colisiones potenciales. &sta modalidad de la herencia m6ltiple es una 'orma segura - 6til para dotar a una clase con ms de una cara .inter'a30.

4.!5 =pro'imaci(n al patr(n adaptador


La doble cara de una clase 'acilita adaptar sus operaciones a la cara /ue necesitan otras clases para usar esas operaciones. &l denominado patrn adaptador apro"echa el e'ecto de la doble cara /ue otorga la herencia m6ltiple. Eigura 4. 1$

A m n

B i

C
i/ in$ocar n 0

M i

: i

i n m

"ise;o para conse#uir <ue n sea otro i

"igura 4. !* >ariante del patr(n adaptador

&n la Eigura 4. 1$, la clase A contiene un m?todo n /ue se /uiere incluir como una implementacin ms del m?todo i, declarado en la clase abstracta pura B. &ntonces, se dise:a una clase C /ue herede de las clases A - B el m?todo n - la declaracin del m?todo i respecti"amente. Como ambos elementos se han #untado en la clase C, basta con de'inir /ue la implementacin del m?todo i consiste en in"ocar al m?todo n para conseguir /ue n sea una i ms. &sta 6ltima t?cnica se denomina envolver. 130

Curso de OO dirigido por la introduccin de ambigedad

La herencia, ms aumento de la ambigedad

4.!6 La herencia vista desde el c(digo, un ejemplo


&n cap tulos anteriores se dise:aron pe/ue:os sistemas para traba#ar con tringulos, c rculos - rectngulos. 7hora se /uiere integrar estos sistemas en uno solo. 7 continuacin se muestran los dise:os de cada clase.

"igura 4. !0 lase rculo

"igura 4. !3 lase ?ringulo

131

Curso de OO dirigido por la introduccin de ambigedad

La herencia, ms aumento de la ambigedad

"igura 4. !5 lase /ectngulo

Las clases C rculo, Kectngulo - Mringulo son distintas entre s por/ue tienen atributos distintos - comportamientos distintos> un c rculo se pinta de 'orma distinta /ue un rectngulo - /ue un tringulo@ tambi?n la 'orma de ampliarlo, reducirlo o mo"erlo es distinta a la del rectngulo - el tringulo. =ero todas ellas son 'iguras, por tanto se podr dise:ar una abstraccin /ue e)prese la esencia de inter?s - omita los detalles /ue las di'erencian. La clase 4i2ura, discutida antes, puede ser un punto de partida para este dise:o particular. Las cabeceras de las operaciones de cada 'igura coinciden por/ue han sido dise:adas con una disciplina, manteniendo un estilo. Si las cabeceras no coincidieran ser a posible aplicar una t?cnica de adaptacin para uni'ormarlas. La coincidencia es necesaria para conseguir /ue las operaciones sean polimr'icas cuando se relacionen con las operaciones homnimas de la clase 4i2ura. Eigura 4. 11

13%

Curso de OO dirigido por la introduccin de ambigedad

La herencia, ms aumento de la ambigedad

"igura 4. !6 lase abstracta "igura

&n la nue"a clase 4i2ura se ha incluido el m?todo concreto borrar:; por/ue, de inicio, se considera /ue ser com6n a todos los subtipos, independientemente de la 'igura. 9na 'igura se borra pidi?ndole /ue se pinte con el color de 'ondo. La implementacin de borrar:; estar en la clase madre - las hi#as heredarn el cdigo de ella. La presencia de este m?todo hace /ue la clase 4i2ura sea abstracta, pero no abstracta pura o inter'a3. 7dems, en esta clase se han a:adido los atributos color ha<da os /ue son comunes a todas las 'iguras. &n el diagrama el nombre de la clase 4i2ura est escrito en letra cursi"a por/ue 9!L usa este tipo de letra para indicar /ue un elemento es abstracto. Mambi?n est escritos con la misma letra los m?todos abstractos o "irtuales pain :;, mover:;, ampliar:; - reducir:;. La Eigura 4. %0 muestra el dise:o del diagrama de clases del sistema.

"igura 4. #7 1iagrama de clases de "igura polim(r%ica

&ntre la clase =en ana - la clase 4i2ura e)iste una relacin de agregacin por/ue la clase =en ana contiene un atributo 4i2ura de tipo 4i2ura. &ste atributo ser en un momento dado un ob#eto C>rculo, ,ri1n2ulo o 0ec 1n2ulo. =ero como todos 133

Curso de OO dirigido por la introduccin de ambigedad

La herencia, ms aumento de la ambigedad

comparten la misma especi'icacin, la clase =en ana puede tratarlos a todos por igual utili3ando la especi'icacin de 4i2ura, sin necesidad de conocer el tipo de 'igura, e)cepto en el instante de la creacin de los ob#etos. 9n constructor est ce:ido a crear ob#etos de una clase espec 'ica, no puede crear ob#etos de otras clases por su especi'icidad. La creacin de un ob#eto no es una operacin polimr'ica. 2e manera /ue el ob#eto creador establece una 'uerte relacin un "oca hacia el ob#eto creado. =ara debilitar esta relacin se utili3an di"ersas t?cnicas seg6n sea el caso. 7lgunas de ellas sern "istas en el curso. La clase =en ana no puede crear ob#etos de tipo 4i2ura por/ue 4i2ura es una clase abstracta. La clase =en ana crear ob#etos de tipo C>rculo, 0ec 1n2ulo ,ri1n2ulo seg6n eli#a, en la pantalla, el usuario del sistema. =or eso ha- una relacin de dependencia de Gentana a cada una de las clases C>rculo, ,ri1n2ulo - 0ec 1n2ulo. 9na "e3 /ue el usuario ha-a elegido la 'igura se asignar al atributo 'igura el ob#eto creado =en ana podr traba#ar con ?l a tra"?s de la especi'icacin de 4i2ura. Se abre la puerta al uso del polimor'ismo. Gol"iendo al principio de sustitucin de Lis4o", obser"amos /ue en este caso C>rculo, ,ri1n2ulo - 0ec 1n2ulo son subtipos de 4i2ura -a /ue podemos sustituir 4i2ura por cual/uiera de ellos en el cdigo de =en ana - el resultado ser correcto.

134

Curso de OO dirigido por la introduccin de ambigedad

La herencia, ms aumento de la ambigedad

4.#7 $l polimor%ismo en @ava


Geamos cmo se implementa el polimor'ismo en el lengua#e 8a"a. 7 continuacin mostramos el cdigo de las clases =en ana, 4i2ura, C>rculo, ,ri1n2ulo 0ec 1n2ulo del e#emplo anterior. &l cdigo del programa completo puede "erse en el ane)o.
import javax.swing.*; import java.awt.*; import java.awt.event.*; public class Ventana extends JFrame implements ActionListener{ private Figura figura; private J anel paneloperaciones! panelfiguras; 2eclaramos en ventana el atributo figura de la clase Figura

private J"utton circulo! rectangulo! triangulo! ampliar! reducir! arriba! abajo! i#$da! dc%a; public Ventana&' { //Pintar la ventana vaca set(itle&) intar Figuras)'; asignarLoo*AndFeel&'; set+lose+lic*&'; set,xtended-tate&.A/0.01,23"4(5'; configurar670&'; //Repintar la ventana con la figura pac*&'; set,xtended-tate&.A/0.01,23"4(5'; setVisible&true'; 8 private void asignarLoo*AndFeel&' { //Forzar el Look and Feel de la ventana al del sistema -tring laf 9 70.anager.get-:stemLoo*AndFeel+lass;ame&'; tr: { 70.anager.setLoo*AndFeel&laf'; 8 catc% &7nsupportedLoo*AndFeel,xception exc' {-:stem.err.println&)7nsupported< ) = laf';8 catc% &,xception exc' {-:stem.err.println&),rror cargando< ) = laf';8 8 private void set+lose+lic*&' { //Controlar el cierre de la ventana add>indowListener&new >indowAdapter&' { public void window+losing&>indow,vent e' {-:stem.exit&?';8 8'; 8 private void configurar670&'{

13$

Curso de OO dirigido por la introduccin de ambigedad


//Crear los paneles de botones de figuras y operaciones panelfiguras 9 new J anel&'; panelfiguras.setLa:out&new 6ridLa:out&''; paneloperaciones 9 new J anel&'; paneloperaciones.setLa:out&new 6ridLa:out&'';

La herencia, ms aumento de la ambigedad

//Crear los botones de figuras y aadirlos al panel de figuras circulo9new J"utton&) intar +irculo)'; circulo.addActionListener&t%is'; panelfiguras.add&circulo'; rectangulo9new J"utton&) intar @ectangulo)'; rectangulo.addActionListener&t%is'; panelfiguras.add&rectangulo'; triangulo9new J"utton&) intar (riangulo)'; triangulo.addActionListener&t%is'; panelfiguras.add&triangulo'; //Crear los botones de operaciones y aadirlos al panel de operaciones // ienen !ue estar in"abilitados "asta !ue se "aya elegido una figura ampliar9new J"utton&)Ampliar)'; ampliar.addActionListener&t%is'; ampliar.set,nabled&false'; paneloperaciones.add&ampliar'; reducir9new J"utton&)@educir)'; reducir.addActionListener&t%is'; reducir.set,nabled&false'; paneloperaciones.add&reducir'; arriba9new J"utton&).over arriba)'; arriba.addActionListener&t%is'; arriba.set,nabled&false'; paneloperaciones.add&arriba'; abajo9new J"utton&).over abajo)'; abajo.addActionListener&t%is'; abajo.set,nabled&false'; paneloperaciones.add&abajo'; i#$da9new J"utton&).over i#$da)'; i#$da.addActionListener&t%is'; i#$da.set,nabled&false'; paneloperaciones.add&i#$da'; dc%a9new J"utton&).over dc%a)'; dc%a.addActionListener&t%is'; dc%a.set,nabled&false'; paneloperaciones.add&dc%a'; //#adir los paneles de botones$ figuras en la parte superior y //operaciones en la parte inferior de la ventana get+ontent ane&'.add&panelfiguras!"orderLa:out.;4@(5'; get+ontent ane&'.add&paneloperaciones!"orderLa:out.-47(5'; 8 /%% &ane'ador de eventos para controlar los botones %/ public void action erformed&Action,vent e' { int #oom9A; int despla#amiento9A?; 4bject boton9e.get-ource&'; if &boton 99 circulo'{ figura 9 new +irculo&'; ampliar.set,nabled&true'; reducir.set,nabled&true'; arriba.set,nabled&true'; abajo.set,nabled&true'; i#$da.set,nabled&true';

13(

Curso de OO dirigido por la introduccin de ambigedad


dc%a.set,nabled&true'; 8 if &boton 99 rectangulo'{ figura 9 new @ectangulo&'; ampliar.set,nabled&true'; reducir.set,nabled&true'; arriba.set,nabled&true'; abajo.set,nabled&true'; i#$da.set,nabled&true'; dc%a.set,nabled&true'; 8 if &boton 99 triangulo'{ figura 9 new (riangulo&'; ampliar.set,nabled&true'; reducir.set,nabled&true'; arriba.set,nabled&true'; abajo.set,nabled&true'; i#$da.set,nabled&true'; dc%a.set,nabled&true'; 8 if &boton 99 reducir' figura.reducir&#oom'; if &boton 99 ampliar' figura.ampliar&#oom'; if &boton 99 arriba' figura.mover&?!Bdespla#amiento'; if &boton 99 abajo' figura.mover&?!despla#amiento'; if &boton 99 i#$da' figura.mover&Bdespla#amiento!?'; if &boton 99 dc%a' figura.mover&despla#amiento!?'; t%is.repaint&'; 8 public void paint &6rap%ics g' { super.paint&g'; if &figuraC9null' figura.paint&g'; 8 public static void main&-tringDE args' { new Ventana&'; 8

La herencia, ms aumento de la ambigedad

8 public abstract class Figura extends J anel{ protected +olor color; protected boolean %a:datos9false; public Figura&' { 8 public void paint&6rap%ics g'{

2eclaramos la abstracta Figura

clase

,l mFtodo paint deberGa ser abstracto! pero para poder utili#ar el #P( s)ing necesitamos $ue estF implementado en todas las clases.

13*

Curso de OO dirigido por la introduccin de ambigedad


super.paint&g'; 8

La herencia, ms aumento de la ambigedad

public abstract void mover &int despla#amientox! int despla#amiento:'; public abstract void ampliar &int #oomin'; public abstract void reducir &int #oomout'; public void borrar&'{ //Pintarme del color del fondo de la ventana color9 t%is.get"ac*ground&'; repaint&'; 8 8 public class +irculo extends Figura{ //Coordenada * del centro private int centrox; //Coordenada y del centro private int centro:; //Radio private int radio; //Crea una nueva instancia de Circulo public +irculo&' { // &ostrar el formulario para obtener los datos del circulo Formulario+irculo formulario9 new Formulario+irculo&'; HHJ2ialog dialog 9 new J2ialog&t%is! )0ntrodu#ca los datos del circulo)! true'; J2ialog dialog 9new J2ialog&'; dialog.set(itle&)0ntrodu#ca los datos del circulo)'; dialog.set.odal&true'; dialog.set+ontent ane&formulario'; dialog.set2efault+lose4peration&javax.swing.>indow+onstants.502,34;3+L4-,'; dialog.pac*&'; dialog.s%ow&'; // +btener los datos introducidos por el usuario centrox9formulario.obtener+entrox&'; centro:9formulario.obtener+entro:&'; radio9formulario.obtener@adio&'; color9formulario.obtener+olor&'; %a:datos9true; 8 public void paint &6rap%ics g' { super.paint&g'; //,i el usuario "a introducido los datos pinta el circulo if &%a:datos'{ g.set+olor&color'; g.draw4val&centroxBradio! centro:Bradio!A*radio!A*radio'; g.fill4val&centroxBradio! centro:Bradio!A*radio!A*radio'; g.dispose&'; 8 8 2eclaramos +Grculo $ue Figura la clase %ereda de 2eclaramos los mFtodos abstractos mover! ampliar : reducir

0mplementamos el mFtodo paint

13,

Curso de OO dirigido por la introduccin de ambigedad

La herencia, ms aumento de la ambigedad

public void mover &int despla#amientox! int despla#amiento:'{ centrox9centrox=despla#amientox; centro:9 centro:=despla#amiento:; 8 8 public void ampliar &int #oomin'{ if &#oomin I ?'{ radio9radio*#oomin; 8 8 public void reducir &int #oomout'{ if &#oomout I ?'{ radio9radioH#oomout; 8 8 public class @ectangulo extends Figura{ //Coordenada * del vertice superior iz!uierdo private int origenx; //Coordenada y del vertice superior iz!uierdo private int origen:; //-ase private int base; //#ltura private int altura; //Crea una nueva instancia de Rectangulo public @ectangulo&' { // &ostrar el formulario para obtener los datos del rectangulo Formulario@ectangulo formulario9 new Formulario@ectangulo&'; J2ialog dialog 9new J2ialog&'; dialog.set(itle&)0ntrodu#ca los datos del rectangulo)'; dialog.set.odal&true'; dialog.set+ontent ane&formulario'; dialog.set2efault+lose4peration&javax.swing.>indow+onstants.502,34;3+L4-,'; dialog.pac*&'; dialog.s%ow&'; // +btener los datos introducidos por el usuario origenx9formulario.obtener4rigenx&'; origen:9formulario.obtener4rigen:&'; base9formulario.obtener"ase&'; altura9formulario.obtenerAltura&'; color9formulario.obtener+olor&'; %a:datos9true; 8 public void paint&6rap%ics g' { super.paint&g'; //,i el usuario "a introducido los datos pinta el rectangulo if &%a:datos'{ 0mplementamos el mFtodo paint 2eclaramos la clase @ectJngulo $ue %ereda de Figura 0mplementamos el mFtodo reducir 0mplementamos el mFtodo ampliar 0mplementamos el mFtodo mover

131

Curso de OO dirigido por la introduccin de ambigedad


g.set+olor&color'; g.draw@ect&origenx!origen:!base!altura'; g.fill@ect&origenx!origen:!base!altura'; g.dispose&'; 8 8

La herencia, ms aumento de la ambigedad

public void mover &int despla#amientox! int despla#amiento:'{ origenx9origenx=despla#amientox; origen:9origen:=despla#amiento:; 8 public void ampliar &int #oomin'{ if &#oomin I ?'{ base9 base * #oomin; altura9altura*#oomin; 8 8 public void reducir &int #oomout'{ if &#oomout I ?'{ base9 base H #oomout; altura9altura H #oomout; 8 8 8 public class (riangulo extends Figura{ //Coordenada * del vertice superior private int verticesuperiorx; //Coordenada y del vertice superior private int verticesuperior:; //-ase private int base; //#ltura private int altura; // Crea una nueva instancia de riangulo public (riangulo &' {

0mplementamos el mFtodo mover

0mplementamos el mFtodo ampliar

0mplementamos el mFtodo reducir

2eclaramos la clase (riJngulo $ue %ereda de Figura

// &ostrar el formulario para obtener los datos del triangulo Formulario(riangulo formulario9 new Formulario(riangulo&'; J2ialog dialog 9new J2ialog&'; dialog.set(itle&)0ntrodu#ca los datos del triangulo)'; dialog.set.odal&true'; dialog.set+ontent ane&formulario'; dialog.set2efault+lose4peration&javax.swing.>indow+onstants.502,34;3+L4-,'; dialog.pac*&'; dialog.s%ow&'; // +btener los datos introducidos por el usuario verticesuperiorx9formulario.obtenerVertice-uperiorx&'; verticesuperior:9formulario.obtenerVertice-uperior:&'; base9formulario.obtener"ase&'; altura9formulario.obtenerAltura&';

140

Curso de OO dirigido por la introduccin de ambigedad


color9formulario.obtener+olor&'; %a:datos9true; 8 public void paint&6rap%ics g' { int DE coordenadasx9get+oordenadas/&'; int DE coordenadas:9get+oordenadasK&'; super.paint&g'; //,i el usuario "a introducido los datos pinta el triangulo if &%a:datos'{ g.set+olor&color'; g.draw ol:gon&coordenadasx! coordenadas:! L'; g.fill ol:gon&coordenadasx! coordenadas:! L'; g.dispose&'; 8 8 private int DE get+oordenadas/&'{ int DE coordenadasx 9 new int DLE; coordenadasxD?E9verticesuperiorx; coordenadasxDME9verticesuperiorxB&baseHA'; coordenadasxDAE9verticesuperiorx=&baseHA'; return coordenadasx; 8 private int DE get+oordenadasK&'{ int DE coordenadas:9 new intDLE; coordenadas:D?E9verticesuperior:; coordenadas:DME9verticesuperior:=altura; coordenadas:DAE9verticesuperior:=altura; return coordenadas:; 8

La herencia, ms aumento de la ambigedad

0mplementamos el mFtodo paint

public void mover &int despla#amientox! int despla#amiento:'{ verticesuperiorx 9 verticesuperiorx = despla#amientox; verticesuperior: 9 verticesuperior: = despla#amiento:; 8 public void ampliar &int #oomin'{ if &#oomin I ?'{ base9 base * #oomin; altura9altura*#oomin; 8 8 public void reducir &int #oomout'{ if &#oomout I ?'{ base 9 base H #oomout; altura 9 altura H #oomout; 8 8

0mplementamos el mFtodo mover

0mplementamos el mFtodo ampliar

0mplementamos el mFtodo reducir

141

Curso de OO dirigido por la introduccin de ambigedad


8

La herencia, ms aumento de la ambigedad

4.#! $jercicio
Keutilice el la solucin de 'iguras geom?tricas para dibu#ar una cara. &l aspecto de la cara se muestra a continuacin. =uede suponer /ue el contorno de la cara es un c rculo, /ue los o#os tambi?n son c rculos - /ue la boca es un rectngulo mu- estrecho.

14%

Curso de OO dirigido por la introduccin de ambigedad

La herencia, ms aumento de la ambigedad

8na soluci(n
=ensar en ob#etos es asociar a un ob#eto la tarea de dibu#ar la cara. Ser a un ob#eto compuesto de otros ob#etos@ uno por cada componente de la cara. =or e#emplo> contorno de la cara. o$oderecho - o$oi6quierdo, son dos ob#etos de la clase C>rculo asociados con los o#os. boca. 7dems con"iene considerar como atributos del ob#eto Cara cen rox - cen ro<, son dos n6meros enteros para indicar las coordenadas del centro de la cara. Ser"irn para situar la cara en la pantalla. cara. color, un atributo de tipo Color .tipo prede'inido en 8a"a0 /ue indica el color de la cara. La cara estar contenida en una "entana, igual /ue en las 'iguras geom?tricas, por/ue se est traba#ando en un entorno de "entanas . ?indo?s0. La Eigura 4. %1 muestra el diagrama de clases. aman<o, un n6mero entero para indicar el tama:o de la boca, es un ob#eto de la clase 0ec 1n2ulo asociado con la con orno, es un ob#eto de la clase C>rculo asociado con el

143

Curso de OO dirigido por la introduccin de ambigedad

La herencia, ms aumento de la ambigedad

"igura 4. #! 1iagrama de clases de Aintar ara

Las relaciones de agregacin entre las clases Cara, C>rculo - 0ec 1n2ulo e)presan /ue los ob#etos de la clase Cara estn compuestos por ob#etos de las clases C>rculo - 0ec 1n2ulo. &stas relaciones re'le#an el tipo de los atributos contorno, o#oderecho, o#oi3/uierdo - boca. Geamos a continuacin el cdigo de la clase Cara escrito en el lengua#e 8a"a
public class +ara extends J anel{ HHextendsJ anel es necesario para usar el A i swing private +irculo ojoderec%o! ojoi#$uierdo; HHojos private @ectangulo boca; HHboca private +irculo contorno; HHcontorno private int taman:o9A??; HHtamaNo de la cara private int centrox9O??; HHcoordenada x del centro de la cara private int centro:9LO?; HHcoordenada : del centro de la cara private +olor color9+olor.K,LL4>; HHcolor de fondo de la cara HH +rea una nueva instancia de +ara public +ara&' { HHcrear el contorno contorno 9 new +irculo&centrox! centro:! taman:o! color'; HHcrear los ojos ojoi#$uierdo 9 new +irculo&centroxB&taman:oHL'! centro:B&taman:oHP'! M?! +olor."LA+Q '; ojoderec%o 9 new +irculo&centrox=&taman:oHL'! centro:B&taman:oHP'! M?! +olor."LA+Q '; HHcrear la boca boca 9 new @ectangulo&centroxB&taman:oHP'! centro:=&taman:oHA'! taman:oHA! A! +olor."LA+Q'; 8

144

Curso de OO dirigido por la introduccin de ambigedad


public void paint &6rap%ics g' { super.paint&g'; HHnecesario para utili#ar el A 0 swing HHpintar el contorno contorno.paint&g'; HHpintar los ojos ojoderec%o.paint&g'; ojoi#$uierdo.paint&g'; HHpintar la boca boca.paint&g'; 8 8

La herencia, ms aumento de la ambigedad

La solucin pinta la cara reutili3ando la estructura de 'iguras desarrollada anteriormente. La Eigura 4. %% muestra el resultado de la e#ecucin del programa.

"igura 4. ## /esultado de Aintar ara

14$

Curso de OO dirigido por la introduccin de ambigedad

La herencia, ms aumento de la ambigedad

4.## Otro ejercicio


La cara /ue pintamos no les gust a los ni:os - propusieron /ue el contorno 'uese un cuadrado. Faga las modi'icaciones necesarias en el dise:o para satis'acer la nue"a solicitud. 2e paso, e"al6e la 'acilidad /ue o'rece su dise:o anterior para a#ustarse a este cambio.

9na solucin posible, consiste en reutili3ar el dise:o anterior modi'icando el atributo con orno de la clase Cara para /ue sea un ob#eto de la clase 0ec 1n2ulo en lugar de C>rculo. Como ambas clases, 0ec 1n2ulo - C>rculo, tienen un m?todo llamado pain :;, no ser a necesario modi'icar el m?todo pain :; de Cara, -a /ue el mensa#e con orno.pain :; sigue siendo "lido.

14(

Curso de OO dirigido por la introduccin de ambigedad

La herencia, ms aumento de la ambigedad

La b;s-ueda de la plasticidad, un cambio del diseBo


&l cambio o rea#uste de re/uisitos es un 'enmeno mu- 'recuente en el so't+are, tanto /ue resulta ser uno de los problemas ms importantes .- tambi?n rentables0 del desarrollo de so't+are. La solucin anterior al e#ercicio de las caras resol"i la situacin de modo directo, sin pensar ms all, por/ue lo /ue no se sabe, no se sabe. 2e lo contrario en el so't+are se contratar an orculos, "identes, cual/uiera /ue sea capa3 de anticiparse .con e)actitud0, pero no dan resultado. La solucin anterior, sin otro conocimiento, est bien. 7hora han "ariado las condiciones - -a se sabe /ue se /uiere modi'icar el contorno. =ero, si ha- cambios en el contorno podr haber cambios en cual/uier otro atributo de la cara. &ntonces, con"iene dise:ar una solucin de ma-or plasticidad .de'ormable0, /ue admita como componente de la cara cual/uier 'igura. Se trata de introducir ambigedad en el dise:o. 9n paso en esa direccin es asignar los atributos con orno, o$oi6quierdo, o$oderecho - boca de tipo Eigura, usando la palabra tipo en el sentido estricto de Lis4o". La intencin es apro"echar la posibilidad de polimor'ismo /ue o'recen las operaciones de la clase 4i2ura. &l dise:o de los componentes de la cara como ob#etos de la clase 4i2ura introduce su'iciente ambigedad para componer la cara con cual/uier 'igura de las disponibles actualmente o en el 'uturo. Otro paso /ue aumenta la plasticidad del dise:o es agrupar los componentes de la cara en un "ector .facciones0 con la 'inalidad de 'acilitar la uni'ormidad del tratamiento. &l uso de un "ector de componentes a:ade ambigedad al dise:o por/ue los nombres de los componentes se sustitu-en por ordinales> el primer componente, el segundo, etc. Rracias a esta ambigedad se gana en igualdad de proceso - en 'acilidad de modi'icacin. =ero la ambigedad tambi?n puede di'icultar la comprensin por un e'ecto de desconcierto. Casi nada es gratis. =ara reducir el posible e'ecto negati"o de la ambigedad se han utili3ado "ariables temporales con los nombres de los componentes.

14*

Curso de OO dirigido por la introduccin de ambigedad

La herencia, ms aumento de la ambigedad

Sin embargo, a pesar de toda la ambigedad introducida en el dise:o, se mantienen dependencias directas de Cara hacia C>rculo - 0ec 1n2ulo a causa de las operaciones de creacin de ob#etos. Slo cuando los creamos necesitamos declarar su tipo espec 'ico C>rculo - 0ec 1n2ulo .recordemos /ue no pueden crease ob#etos de clases abstractas como 4i2ura0. &n la apro)imacin a los patrones se "er una solucin /ue reducen estas ligaduras. 9na "e3 creados los ob#etos podemos tratarlos a todos por igual usando los m?todos de la clase 4i2ura. =or eso ahora, en el m?todo pain :; de Cara utili3amos un ob#eto de tipo 4i2ura para recorrer el "ector facciones - pintar cada uno de sus elementos. Como todos los elementos de facciones son de tipo 4i2ura siempre podremos llamar al m?todo pain :; del elemento concreto utili3ando la cabecera /ue heredan todos de 4i2ura. La Eigura 4. %3 muestra el dise:o del diagrama de clases de esta otra nue"a solucin de ms plasticidad.

"igura 4. #& 1iagrama de clases de Aintar ara polim(r%ico

&l dise:o de la Eigura 4. %3 aumenta la 'acilidad de e)tensin - modi'icacin del sistema .plasticidad0 pero conser"a la 'uncin del sistema@ toda" a los contornos de las caras son c rculos. &ste e#emplo ilustra la siguiente de'inicin> 14,

Curso de OO dirigido por la introduccin de ambigedad

La herencia, ms aumento de la ambigedad

Se denomina fac ori6aci!n a las modi'icaciones /ue se reali3an en los dise:os para me#orar alguna cualidad interna del sistema sin "ariar sus 'unciones. Geamos el cdigo 8a"a de esta nue"a clase Cara.

public class +ara extends J anel{ pri$ate =ector >acciones? HHVector de objetos Figura $ue contiene las facciones de la cara< HHcontorno! ojoderec%o! ojoi#$uierdo : boca private int taman:o9A??; HHtamaNo de la cara private int centrox9O??; HHcoordenada x del centro de la cara private int centro:9LO?; HHcoordenada : del centro de la cara private +olor color9+olor.K,LL4>; HHcolor de fondo de la cara H** +rear una nueva instancia de +ara *H public +ara&' { 4i#ura contorno, ojoi%<uierdo, ojoderecho, boca? facciones 9 new Vector&'; @@crear el contorno a;adirlo a las >acciones contorno A neB Circulo)centro9, centro , taman o, color*? facciones.add&contorno'; @@crear los ojos a;adirlo a las >acciones ojoi%<uierdo A neB Circulo)centro9C)taman o@3*, centro C)taman o@4*, 1D, ColorEB-ACF *? facciones.add&ojoi#$uierdo'; ojoderecho A neB Circulo)centro9G)taman o@3*, centro C)taman o@4*, 1D, ColorEB-ACF *? facciones.add&ojoderec%o'; @@crear la boca a;adirlo a las >acciones boca A neB 6ectan#ulo)centro9C)taman o@4*, centro G)taman o@2*, taman o@2, 2, ColorEB-ACF*? facciones.add&boca'; 8 public void paint &6rap%ics g' { Figura figura; super.paint&g'; HHlo utili#amos para pintar la ventana de >indows HHpintamos los elementos del vector facciones 0terator i9facciones.iterator&'; w%ile &i.%as;ext&''{ figura9 &Figura' i.next&'; >i#uraEpaint)#*? 8 8 8

141

Curso de OO dirigido por la introduccin de ambigedad

La herencia, ms aumento de la ambigedad

La soluci(n del rectngulo


2ada la plasticidad del dise:o nue"o, el cambio del contorno de la cara se resuel"e slo modi'icando la l nea en la /ue creamos el ob#eto contorno para crear un Kectngulo en lugar de un C rculo. Geamos este cambio sobre el cdigo.

public class +ara extends J anel{ private Vector facciones; HHVector de objetos Figura $ue contiene las facciones de la cara< HHcontorno! ojoderec%o! ojoi#$uierdo : boca private int taman:o9A??; HHtamaNo de la cara private int centrox9O??; HHcoordenada x del centro de la cara private int centro:9LO?; HHcoordenada : del centro de la cara private +olor color9+olor.K,LL4>; HHcolor de fondo de la cara H** +rear una nueva instancia de +ara *H public +ara&' { Figura contorno! ojoi#$uierdo! ojoderec%o! boca; facciones 9 new Vector&'; HHcrear el contorno : aNadirlo a las facciones contorno A neB 6ectan#ulo)centro9Ctaman o,centro Ctaman o,27taman o,27taman o,color*? facciones.add&contorno'; HHcrear los ojos : aNadirlo a las facciones ojoi#$uierdo 9 new +irculo&centroxB&taman:oHL'! centro:B&taman:oHP'! M?! +olor."LA+Q '; facciones.add&ojoi#$uierdo'; ojoderec%o 9 new +irculo&centrox=&taman:oHL'! centro:B&taman:oHP'! M?! +olor."LA+Q '; facciones.add&ojoderec%o'; HHcrear la boca : aNadirlo a las facciones boca 9 new @ectangulo&centroxB&taman:oHP'! centro:=&taman:oHA'! taman:oHA! A! +olor."LA+Q'; facciones.add&boca'; 8 public void paint &6rap%ics g' { Figura figura; super.paint&g'; HHlo utili#amos para pintar la ventana de >indows HHpintamos los elementos del vector facciones 0terator i9facciones.iterator&'; w%ile &i.%as;ext&''{ figura9 &Figura' i.next&'; figura.paint&g'; 8 8 8

1$0

Curso de OO dirigido por la introduccin de ambigedad

La herencia, ms aumento de la ambigedad

La Eigura 4. %4 muestra el resultado de la e#ecucin del programa.

"igura 4. #4 /esultado de Aintar ara

Cibliogra%a
A;ooch 14B Rrad- ;ooch, CObject Oriented =nal+sis and 1esignD &d. ;en#amin Cummings =ublishing, 1114

AKumbaugh 1$B 8ames Kumbaugh et al. CModelado + 1iseBo Orientado a ObjetosD &d. =rentice Fall, 111$ ALis4o" ,(B ;arbara Lis4o" et al. C=bstraction and Speci%ication in Arogram 1evelopmentD Cambridge, !7> Mhe !NM =ress, 11,, AEo+ler 1*B !artin Eo+ler, C=nal+sis AatternsD &d. 7ddisonTUesle-, 111*

1$1

S-ar putea să vă placă și