Ministerio del Poder Popular Para la Educacin Universitaria
Misin Sucre Aldea Gran Mariscal de Ayacuco! "u#an$ Edo% Sucre Programacin Orientada a Objetos Realizado por: Vicente Astudillo "%&%' ()**+,*- E.lys Alvarez "%&%' /00*)112 3o#ileidys 3el.ado /*,21(1- &n4or#$tica Seccin U Cuman, mayo de 201 !acilitador: 5uis 6rte.a "ntroduccin 5a pro.ra#acin orientada a ob7etos8 a to#ado las #e7ores ideas de la pro.ra#acin estructurada y los a co#binado con varios conceptos nuevos y potentes 9ue incitan a conte#plar las tareas de pro.ra#acin desde un nuevo punto de vista% 5a pro.ra#acin orientada a ob7etos8 per#ite desco#poner #as 4$cil#ente un proble#a en sub.rupos de partes relacionadas del proble#a% Entonces8 utilizando el len.ua7e se pueden traducir estos sub.rupos a unidades autocontenidas lla#adas ob7etos% El t:r#ino Pro.ra#acin 6rientada a 6b7etos ;P66<8 oy en d=a a#plia#ente utilizado8 es di4=cil de de4inir8 ya 9ue no es un concepto nuevo8 sino 9ue a sido el desarrollo de t:cnicas de pro.ra#acin desde principios de la d:cada de los setenta8 aun9ue sea en la d:cada de los noventa cuando a au#entado su di4usin8 uso y popularidad% >o obstante8 se puede de4inir P66 co#o una t:cnica o estilo de pro.ra#acin 9ue utiliza ob7etos co#o blo9ue esencial de construccin% Un ob7eto es una unidad 9ue contiene datos y las 4unciones 9ue operan sobre esos datos% A los ele#entos de un ob7eto se les conoce co#o #ie#bros? las 4unciones 9ue operan sobre los ob7etos se deno#inan #:todos y los datos se deno#inan #ie#bros datos% #esarrollo Constructor es una subrutina cuya #isin es inicializar un ob7eto de una clase% En el constructor se asi.nan los valores iniciales del nuevo ob7eto% Se utiliza para crear tablas de clases virtuales y poder as= desarrollar el poli#or4is#o8 una de las erra#ientas de la pro.ra#acin orientada a ob7etos% Al utilizar un constructor8 el co#pilador deter#ina cual de los ob7etos va a responder al #ensa7e ;virtual< 9ue e#os creado% @iene un tipo de acceso8 un no#bre y un par:ntesis% #estructor en pro.ra#acin orientada a ob7etos es una 4uncin #ie#bro especial lla#adas auto#$tica#ente en la e7ecucin del pro.ra#a8 y por tanto no tienen por 9u: ser lla#adas eApl=cita#ente por el pro.ra#ador% Sus principales co#etidos son' liberar los recursos co#putacionales 9ue el ob7eto de dica clase aya ad9uirido en su tie#po de e7ecucin al eApirar :ste% 9uitar los v=nculos 9ue pudiesen tener otros recursos u ob7etos con :ste% 5os destructores son invocados auto#$tica#ente al alcanzar el 4lu7o del pro.ra#a el 4in del $#bito en el 9ue est$ declarado el ob7eto% $obrecarga: se re4iere a la posibilidad de tener dos o #$s 4unciones con el #is#o no#bre pero 4uncionalidad di4erente% Es decir8 dos o #$s 4unciones con el #is#o no#bre realizan acciones di4erentes% El co#pilador usar$ una u otra dependiendo de los par$#etros usados% A esto se lla#a ta#bi:n sobrecar.a de 4unciones% $obrecarga de %unciones: una 4or#a con la 9ue "BB consi.ue el poli#or4is#o es #ediante la utilizacin de la sobrecar.a de 4unciones % En "BB8 dos o #as 4unciones pueden co#partir el #is#o no#bre sie#pre 9ue la declaracin de sus par$#etros sea di4erente% En esta situacin 8las 4unciones 9ue co#parten el #is#o no#bre se dice 9ue est$n sobrecar.adas %Por e7e#plo8consid:rese el si.uiente pro.ra#a' #include<iostream.h>
//cuadrado se sobrecarga de tres formas int cuadrado(int i); double cuadrado(double d); long cuadrado(long l);
int main() { cout<<cuadrado(10)<<"\n"; cout<<cuadrado(11.0)<<"\n"; cout<<cuadrado(!)<<"\n"; return 0; " int cuadrado(int i) { cout<<"#e encuentra dentro de la funcion cuadrado() $ue utili%a "; cout<<"&n argumento entero.\n";
return i'i; " double cuadrado(double d) { cout<<"#e encuentra dentro de la funcion cuadrado()$ue utili%a"; cout<<"un argumento double.\n";
return d'd; " long cuadrado(long l) { cout<<"#e encuentra dentro de la funcion cuadrado() $ue utili%a"; cout<<"un argumento long.\n";
return 1'1; " El pro.ra#a anterior crea tres 4unciones si#ilares 8pero distintas8deno#inadas cuadrado&'8cada una de las cuales devuelve el cuadrado del valor 9ue se le pasa co#o ar.u#ento% "o#o #uestra el pro.ra#a8el co#pilador sabe 9ue la 4uncin 9ue debe utilizar en cada caso dependiendo del tipo del ar.u#ento 9ue se le pasa% 5a i#portancia de las 4unciones sobrecar.adas es 9ue per#iten acceder #ediante un no#bre co#n a un con7unto de 4unciones relacionadas% En este sentido 8la sobrecar.a de 4unciones per#ite crear un no#bre .en:rico para una operacin ? el co#pilador se encar.a de decidir la 4uncin 9ue se necesita real#ente para realizar la operacin% $obrecarga de operadores: otra 4or#a de conse.uir el poli#or4is#o en "BB es #ediante la sobrecar.a de operadores% Por e7e#plo 8en "BB se pueden utilizar los operadores CC y DD para realizar operaciones de EES a trav:s del ter#inal% Esto es posible puesto 9ue estos operadores estan sobrecar.ados en el arcivo de cabecera iostrea#%% "uando un operador se sobrecar.a8ad9uiere un si.ni4icado adicional relativo a una deter#inada clase% >o obstante8si.ue #anteniendo todos sus si.ni4icados anteriores% En .eneral 8se pueden sobrecar.ad operadores de "BB de4iniendo lo 9ue si.ni4ican para una clase espec(4ica% &#a.in)#onos por e7e#plo 9ue tene#os una clase cola8bien es posible sobrecar.ar el operador B para los ob7etos de tipo cola de 4or#a 9ue se aFada el contenido de una cola en otra%Sin e#bar.o8el operador B #antiene su si.ni4icado ori.inal con respecto a los otros tipos de datos% *erencia' Es una propiedad 9ue per#ite 9ue los ob7etos sean creados a partir de otros ya eAistentes8 obteniendo caracter=sticas ;#:todos y atributos< si#ilares a los ya eAistentes% Es la relacin entre una clase .eneral y otra clase #as especi4ica% Es un #ecanis#o 9ue nos per#ite crear clases derivadas a partir de clase base8 >os per#ite co#partir auto#$tica#ente #:todos y datos entre clases subclases y ob7etos% Por e7e#plo' Si declara#os una clase p$rra4o derivada de un clase teAto todos los #:todos y variables asociadas con la clase teAto son auto#$tica#ente eredados por la subclase p$rra4o% Polimor%ismo' Si.ni4ica 9ue un no#bre se puede utilizar para especi4icar una clase .en:rica de acciones% Clase abstracta' Gay ocasiones8 cuando se desarrolla una 7erar9u=a de clases en 9ue al.n co#porta#iento est$ presente en todas ellas pero se #aterializa de 4or#a distinta para cada una% Por e7e#plo8 pense#os en una estructura de clases para #anipular 4i.uras .eo#:tricas% Podr=a#os pensar en tener una clase .en:rica8 9ue podr=a lla#arse Hi.uraGeo#etrica y una serie de clases 9ue eAtienden a la anterior 9ue podr=an ser "irculo8 Poli.ono8 etc% Podr=a aber un #:todo dibu7ar dado 9ue sobre todas las 4i.uras puede llevarse a cabo esta accin8 pero las operaciones concretas para llevarla a cabo dependen del tipo de 4i.ura en concreto ;de su clase<% Por otra parte la accin dibu7ar no tiene sentido para la clase .en:rica Hi.ura Geo#etrica8 por9ue esta clase representa una abstraccin del con7unto de 4i.uras posibles% Para resolver esta proble#$tica Iava proporciona las clases y #:todos abstractos% Un #:todo abstracto es un #:todo declarado en una clase para el cual esa clase no proporciona la i#ple#entacin ;el cdi.o<% Una clase abstracta es una clase 9ue tiene al #enos un #:todo abstracto% Una clase 9ue eAtiende a una clase abstracta debe i#ple#entar los #:todos abstractos ;escribir el cdi.o< o bien volverlos a declarar co#o abstractos8 con lo 9ue ella #is#a se convierte ta#bi:n en clase abstracta $ubclases deri+adas' &ncre#enta#os la 4uncionalidad de la clase Ventana de4iniendo una clase derivada deno#inada VentanaTitulo% 5os ob7etos de dica clase tendr$n todas las caracter=sticas de los ob7etos de la clase base8 pero ade#$s tendr$n un t=tulo8 y se podran desplazar ;se si#ula el desplaza#iento de una ventana con el ratn<%
5a clase derivada eredar$ los #ie#bros dato de la clase base y las 4unciones #ie#bro8 y tendr$ un #ie#bro dato #$s8 el t=tulo de la ventana% (ublic class )entana*itulo extends )entana{ (rotected #tring titulo; (ublic )entana*itulo(int +, int -, int ., int h, #tring nombre) { su(er(+, -, ., h); titulo/nombre; " e,tends es la palabra reservada 9ue indica 9ue la clase VentanaTitulo deriva8 o es una subclase8 de la clase Ventana% 5a pri#era sentencia del constructor de la clase derivada es una lla#ada al constructor de la clase base #ediante la palabra reservada super% 5a lla#ada su(er(+, -, ., h); inicializa los cuatro #ie#bros dato de la clase base Ventana' x8 y8 ancho8 alto% A continuacin8 se inicializa los #ie#bros dato de la clase derivada8 y se realizan las tareas de inicializacin 9ue sean necesarias% Si no se lla#a eApl=cita#ente al constructor de la clase base Iava lo realiza por nosotros8 lla#ando al constructor por de4ecto si eAiste% 5a 4uncin #ie#bro deno#inada desplazar ca#bia la posicin de la ventana8 aFadi:ndoles el desplaza#iento% (ublic 0oid des(la%ar(int d+, int d-){ +1/d+; -1/d-; " Rede4ine la 4uncin #ie#bro mostrar para #ostrar una ventana con un t=tulo% (ublic 0oid mostrar(){ su(er.mostrar(); #-stem.out.(rintln("titulo 2 "1titulo); " En la clase derivada se de4ine una 4uncin 9ue tiene el #is#o no#bre y los #is#os par$#etros 9ue la de la clase base% Se dice 9ue rede4ini#os la 4uncin mostrar en la clase derivada% 5a 4uncin #ie#bro mostrar de la clase derivada VentanaTitulo ace una lla#ada a la 4uncin mostrar de la clase base Ventana8 #ediante su(er.mostrar(); 3e este #odo aproveca#os el cdi.o ya escrito8 y le aFadi#os el cdi.o 9ue describe la nueva 4uncionalidad de la ventana por e7e#plo8 9ue #uestre el t=tulo% Si nos olvida#os de poner la palabra reservada super lla#ando a la 4uncin mostrar8 tendr=a#os una 4uncin recursiva% 5a 4uncin mostrar lla#ar=a a mostrar inde4inida#ente% (ublic 0oid mostrar(){ //3o4o5, funci6n recursi0a #-stem.out.(rintln("titulo 2 "1titulo); mostrar(); " 5a de4inicin de la clase derivada VentanaTitulo8 ser$ la si.uiente% (ac7age 0entana; (ublic class )entana*itulo e+tends )entana{ (rotected #tring titulo; (ublic )entana*itulo(int +, int -, int ., int h, #tring nombre) { su(er(+, -, ., h); titulo/nombre; " (ublic 0oid mostrar(){ su(er.mostrar(); #-stem.out.(rintln("titulo 2 "1titulo); " (ublic 0oid des(la%ar(int d+, int d-){ +1/d+; -1/d-; " "
Objetos de la clase deri+ada "rea#os un ob7eto ventana de la clase derivada VentanaTitulo )entana*itulo 0entana/ne. )entana*itulo(0, 0, 80, 90, ":rinci(al"); Mostra#os la ventana con su t=tulo8 lla#ando a la 4uncin mostrar8 rede4inida en la clase derivada 0entana.mostrar(); 3esde el ob7eto ventana de la clase derivada lla#a#os a las 4unciones #ie#bro de4inidas en dica clase 0entana.des(la%ar(;, 9); 3esde el ob7eto ventana de la clase derivada pode#os lla#ar a las 4unciones #ie#bro de4inidas en la clase base% 0entana.cambiar<imensiones(10, =>); Para #ostrar la nueva ventana desplazada y ca#biada de ta#aFo escribi#os 0entana.mostrar(); -ncapsulacin' Es una t:cnica 9ue per#ite localizar y ocultar los detalles de un ob7eto% 5a encapsulacin previene 9ue un ob7eto sea #anipulado por operaciones distintas de las de4inidas% 5a encapsulacin es co#o una ca7a ne.ra 9ue esconde los datos y sola#ente per#ite acceder a ellos de 4or#a controlada% 5as principales razones t:cnicas para la utilizacin de la encapsulacin son' (< Mantener a salvo los detalles de representacin8 si sola#ente nos interesa el co#porta#iento del ob7eto% /< Modi4icar y a7ustar la representacin a #e7ores soluciones al.or=t#icas o a nuevas tecnolo.=as de so4tJare% Reutilizacin de cdigo se re4iere al co#porta#iento y a las t:cnicas 9ue .arantizan 9ue una parte o la totalidad de un pro.ra#a in4or#$tico eAistente se pueda e#plear en la construccin de otro pro.ra#a% 3e esta 4or#a se aproveca el traba7o anterior8 se econo#iza tie#po8 y se reduce la redundancia% 5a #anera #$s 4$cil de reutilizar cdi.o es copiarlo total o parcial#ente desde el pro.ra#a anti.uo al pro.ra#a en desarrollo% Pero es traba7oso #antener #ltiples copias del #is#o cdi.o8 por lo 9ue en .eneral se eli#ina la redundancia de7ando el cdi.o reusable en un nico lu.ar8 y lla#$ndolo desde los di4erentes pro.ra#as% Este proceso se conoce co#o abstraccin% 5a abstraccin puede verse clara#ente en las bibliotecas de so4tJare8 en las 9ue se a.rupan varias operaciones co#unes a cierto do#inio para 4acilitar el desarrollo de pro.ra#as nuevos% Gay bibliotecas para convertir in4or#acin entre di4erentes 4or#atos conocidos8 acceder a dispositivos de al#acena#iento eAternos8 proporcionar una inter4az con otros pro.ra#as8 #anipular in4or#acin de #anera conocida ;co#o n#eros8 4ecas8 o cadenas de teAto<% Para 9ue el cdi.o eAistente se pueda reutilizar8 debe de4inir al.una 4or#a de co#unicacin o inter4az% Esto se puede dar por lla#adas a una subrutina8 a un ob7eto8 o a una clase% "o#o se a co#entado anterior#ente la clase descendiente puede aFadir sus propios atributos y #:todos pero ta#bi:n puede sustituir u ocultar los eredados% En concreto' (% Se puede declarar un nuevo atributo con el #is#o identi4icador 9ue uno eredado8 9uedando este atributo oculto% Esta t:cnica no es reco#endable% /% Se puede declarar un nuevo m)todo de instancia con la #is#a cabecera 9ue el de la clase ascendiente8 lo 9ue supone su sobreescritura% Por lo tanto8 la sobreescritura o rede4inicin consiste en 9ue #:todos adicionales declarados en la clase descendiente con el #is#o no#bre8 tipo de dato devuelto y n#ero y tipo de par$#etros sustituyen a los eredados% 0% Se puede declarar un nuevo m)todo de clase con la #is#a cabecera 9ue el de la clase ascendiente8 lo 9ue ace 9ue :ste 9uede oculto% Por lo tanto8 los #:todos de clase o est$ticos ;declarados co#o static< no pueden ser rede4inidos% *% Un #:todo declarado con el #odi4icador 4inal ta#poco puede ser rede4inido por una clase derivada% +% Se puede declarar un constructor de la subclase 9ue lla#e al de la superclase de 4or#a i#pl=cita o de #ediante la palabra reservada super% ,% En .eneral puede accederse a los #:todos de la clase ascendiente 9ue an sido rede4inidos e#pleando la palabra reservada super delante del identi4icador del #:todo% Este #ecanis#o slo per#ite acceder al #etodo perteneciente a la clase en el nivel in#ediata#ente superior de la 7erar9u=a de clases% "onstruya#os la clase @aAista%7ava con el si.uiente cdi.o' public class @aAista eAtends Persona K private int n5icencia? public void set>5icencia;int nu#<K n5icencia L nu#? M public int .et5icencia;<K return n5icencia? M M N construya#os Arran9ue@aAista%7ava' public class Arran9ue@aAista K public static void #ain ;Strin. ar.OP<K @aAista taA( L neJ @aAista;<? taA(%set>o#bre;Q5uisQ<? taA(%setEdad;+1<? Syste#%out%println; taA(%.et>o#bre;<<? Syste#%out%println;taA(%.etEdad;<<? M M Aora intente#os usar el constructor 9ue eAist=a en la clase Persona 9ue recibia el no#bre de la persona y va#os a usarlo para la clase @aAista% Para ello construya#os la clase Arran9ue@aAista/%7ava' public class Arran9ue@aAista/ K public static void #ain ;Strin. ar.OP<K @aAista taA( L neJ @aAista;QIoseQ<? taA(%setEdad;+1<? Syste#%out%println; taA(%.et>o#bre;<<? Syste#%out%println;taA(%.etEdad;<<? Syste#%out%println;taA(%.et>5icencia;<<? M M Se .enera un error de co#pilacin8 debido a 9ue los constructores no se eredan8 sino 9ue ay 9ue de4inir nuestros propios constructores% A.re.ue#os en la clase @aAista los si.uientes constructores' public @aAista;int licencia<K super;<? n5icencia L licencia? M public @aAista;Strin. no#bre8int licencia<K super;no#bre<? n5icencia L licencia? M Aora si podre#os co#pilar y e7ecutar la clase Arran9ue@aAista/% 5a lla#ada al #:todo super indica 9ue esta#os lla#ando a un constructor de la clase base ;pense#os 9ue un @aAista antes 9ue @aAista es Persona y por tanto tiene sentido lla#ar al constructor de Persona antes 9ue al de @aAista<% Ade#$s .racias al n#ero de par$#etros de la lla#ada a super pode#os especi4icar cu$l de los constructores de la clase base 9uere#os lla#ar% En 7ava se pueden e#plear dos palabras clave' tis y super% "o#o vi#os en la unidad (8 tis ace alusin a todo el ob7eto y super ace alusin a la parte eredada8 por ello e#plea#os super para re4erenciar al constructor de la clase base% Aora va#os a a.re.ar la 4uncin .et>o#bre dentro de la clase @aAista8 es decir8 tene#os la #is#a 4uncin en Persona y en @aAista' public Strin. .et>o#bre;< K return QSoy un taAista y #e lla#o' Q B super%.et>o#bre;<? M "o#pila#os @aAista y e7ecuta#os Arran9ue@aAista/% Vere#os 9ue el #ensa7e 9ue aparece en pantalla de#uestra 9ue la 4uncin .et>o#bre lla#ada es la de del tipo real del ob7eto construido8 en este caso la de la clase derivada 9ue es @aAista% @a#bien aprecia#os 9ue para acceder al atributo no#bre es necesario acceder al #:todo .et>o#bre de la clase base ;y por ello e#plear super<% En 7ava los atributos y #:todos de la clase base pueden ca#biar su #odi4icador de visibilidad dentro de la clase derivada8 la si.uiente tabla reco.e dicos ca#bios' Modi4icadores en la clase base' public private protected pa9uete En la clase derivada se trans4or#an en' public inaccesible protected pa9uete &naccesible si.ni4ica 9ue8 a pesar de aber sido eredado8 no ay per#isos en la clase derivada para poder acceder a dico ele#ento inaccesible8 pero an as=8 se pueden lla#ar a #:todos de la clase base 9ue si pueden acceder y #odi4icar al ele#ento% Recorde#os 9ue protected si.ni4ica 9ue es private8 pero 9ue al eredar no se ace inaccesible8 es decir 9ue desde la clase derivada se puede acceder% .ibliogra%(a