Professional Documents
Culture Documents
Parapodermandarmensajesalosobjetos,necesitamosunoperador,aestele llamamosel operadorde envo.Cadalenguajepuedetenerelsuyo,peroesfrecuentequeseutilicenlosdospuntos(':')oel punto('.')(enC++ y JAVAeselpuntosimple). As,siqueremosenviarleelmensaje Caminaralobjeto Juandelaclasehombre,escribiramoslo siguiente. hmrJuan.Caminar() +-++--++-------+ +----Mensaje.Invocaelmtododeigualnombre1. +---------Operadordeenvo2. +------------ObjetodelaclasehombrehmrJuan. +---------------Elprefijohombredenotasuclase. 1.EnalgunoslenguajesOOPsepuedehacerqueunmensajeinvoqueunmtodoconnombredistinto. 2.Comohemoscomentado,cadalenguajepuedeutilizarsupropio operadordeenvo. Eloperadordeenvohacequeseejecutelaporcindelcdigoagrupadabajoelnombredelmtodo,y el mtodotrabajarconlosdatospropiosdelainstanciadelaclasealaqueserefiera. Siguiendo elejemplodelosmarcosexpuestos enanteriormente, supongamos quetenemoslasdos instanciassiguientedelaclaseMarco(marco1ymarco2): Valores marco1 7,5 22,12 Verde Doble marco2 14,50 20,60 Verde Simple
CuandoseinvocaelmtodoMostrar()delaclaseMarco:
marco1.Mostrar(); marco2.Mostrar();
Elmtodoeselmismo,perocadainstanciadelaclasetieneunosvaloresdiferentesparasusdatos,por lo queel mtodoutilizarestosvaloresparamostrarlosdosobjetos,deestemodo,el primermarcose mostrarensuscoordenadas(diferentesa lasdelsegundomarco)y consucolorpropio(igualalde segundomarco)yconsutipodelneapropio(diferentealadelsegundomarco). Comoyacomentamos,elobjetoesuntodoencapsulado,conlviajansusmtodosysusdatos,porlo tanto,alaplicarelmismomtodoadosobjetosdiferentes,seproducenresultadosdiferentes:porque losvaloresdesusdatossondiferentes.
Referenciasasmismo
Uncasoespecialocurrecuandoestamoscodificandounmtododeunaclaseytenemosquereferirnos
lamismaqueenelmundoreal:l-
Paraconsultarundatodelobjeto,actuaremosdeigualmodo:
if(this.nTop<1) { ....... }
Constructores
Parapoderutilizarunobjeto,previamentehemosdecrearlo,loquehacemosmedianteelconstructor delaclase(Observequeenvirtud alasobrecarga(referidacuando hablamosdelpolimorfismo)puede habermsdeunconstructor.).Paraello,dependiendodellenguajeexistendosprocedimientos: Utilizandounmtodoespecial,al quese le denotadeunmodotambinespecial(normalmenteconla palabrareservada" constructor").Estemtodonosdevuelveunobjetonuevodeesaclase.Eneste caso,alosmtodosconstructoresselessuelellamarNew(). Utilizandounoperadorespecialqueellenguajeproporcionayquenormalmentesellama" new".Es estecaso,elconstructorolosconstructoressonnotadosdeunaformaespecial:enJava,porejemplo, senotanconelnombredelaclaseynodevuelvenningntipo,nisiquiera"void". As,paracrearunobjetodelaclasehombre,llamadoJuan,escribiremoslosiguiente: 1. HombrehmrJuan=newHombre(); Leestamosdiciendoalmtodoconstructorquenosdevuelvaunnuevoobjeto.Supongamosqueeste objetotienetresdatos(queparamssencillezsonpblicosaunquerecuerdequenucadebehacerlo as)yquequeremosdarlevaloresaesosdatosdelobjeto:Edad,EstaturayColor-de-ojos.Haremoslo siguiente:
hmrJuan.Edad=30; hmrJuan.Alto=180; hmrJuan.Ojos=Marrn;
Habitualmente,losconstructoresdeclasesefabricandetalmodoquepodamoshacerlasdoscosasala vez:crearelobjetoydarvaloresasusdatos,veamoscmo:
HombrehmrJuan=newHombre(30,180,"Marrn"); HombrehmrPepe=newHombre(12,145,"Azul"); HombrehmrAna =newHombre(24,75,"Verde");
Estemtodointernamenteselimitaraahacerlosiguiente:
Hombre() { this.edad=30; this.estatura=175; this.ojos="marrn"; }
Estambinimportante,elconceptode"constructorpordefecto".MuchoslenguajesdeOOP,permiten definirunaclasesincrearunconstructorparala clase.Elleguaje,entonces,utilizael defecto(internoallenguaje)paracrearobjetosdeesaclase.Estemtodointerno,normalmente limitaareservarelespaciodememorianecesarioparaalmacenarlosdatosdelobjeto,peroestosdatos noestninicializadosonoloestncorrectamente,yaqueelconstructorpordefectonopuedesaber quvaloressonlosapropiadosparalosdatosdelaclase. Dehecho,todosnuestrosconstructoressonllamadosporellenguajedespusdequesehayainvocado elconstructorpordefecto,yaquesteesrealizalastareasdebajonivel(reservadememoria,manejo delatabladesmbolos,etc.)necesariasparapoderempezaratrabajarconunobjeto. Encualquiercaso,lamisindelconstructoresconstruiradecuadamenteel constructorhayaterminadosutrabajo,elobjetotienequeestarlistoparaserusado. objeto,es
constructorpor se
decir,cuandoel
Pblicos
Sonvisiblesdentroyfueradelaclasesinrestriccinalguna.La palabrareservadamscomnpara denotarloses"public". Comoyahemoscomentados,losdatosnodebensernuncapblicos,yaqueromperanelprincipiode EncapsulacinquedebeseguirtodoproyectoOOP.
Protegidos
Estosmiembrosdelaclase(yaseandatoso mtodos)sonvisiblesdesdedentrodellaclasey desde cualquierotraclaseheredada,es decir,claseshijas(o subclases,comoprefierallamarlas).Lapalabra reservadamscomnparadenotarloses"protected"o"friend".
Privados
Lo miembros privados son solo accesibles reservadamscomnparadenotarloses"private". Lasintaxismshabitualeslasiguiente: [<public|protected|private>]<TipoVariable><NombreVariable>; Ejemplos:
PublicStringsNombre; ProtectedintnEdad; PrivatelongnAcceso;
desde
dentro
de
la
clase
donde
existen.
La
palabra
[<public|protected|private>]<TipoRetorno><NombreMtodo>...
Ejemplos:
PublicvoidImprimir(); ProtectedintCalcular(); PrivatestringGrabar();
ModificadoresdeContenido
Para ser correctos, estos modificadores deberan tratarse, como su nombre indica, no el captulo dedicado a la accesibilidad, sino en algn otro dedicado a los modificadores de contenido. Sin embargo,ypuestoquesolovamosatratarunmodificadordeestetipo,noshemospermitidoincluirlo enestecaptulo. EsciertoquelamayoradeloslenguajesdeOOPincluyenmsdeunmodificadordecontenido,tanto paradatos como paramtodos, peropuesto quecasitodos lenguajes coinciden soloenuno,aqu trataremossolamenteelmodificadordecontenidoparadatosestticos. Losmodificadoresdecontenidoafectana cmovaa sertratadoelcontenidodelavariable.As,una variableestticamantienesucontenidoparatodaslasinstanciasdelaclasequesehagan,ascomo paralassubclasesquedeellasehereden. Aestas,selesllamavariablesdelaclase,comocontraposicinalasvariablesdeinstancia.Mientras quelasvariablesdeinstanciaseinicializanparacadanuevainstanciaquesehagadelaclase,es decir, existeunacopiaporcadainstanciadela clase,delasvariablesdela claseexisteunasolainstancia, independientementedelnmerodeinstanciacionesquedela clasese hagan.Deestemodo,todoslos objetoscompartenunlugardealmacenamientocomn. Elejemplomstpicodevariabledelaclaseesuncontadordelnmerodeobjetosexistentesdela clase.Paraello,slohayqueincrementarelcontadordesdeelconstructordelaclasey desdeeldestructor.VaseConstructoresydestructores. Elcdigomuysimplificadopodraseralgoas:
classCuenteo { staticlongnObj=0; //Constructor publicCuenteo() { nObj++; } //Destructor protectedvoidfinalize() { nObj--; } //Obtenerelnmerodeobjetosexistentes publiclongGetObj() { returnnObj; } }
decrementarlo
Interfazfrenteaimplementacin
tema,
ms
terico,
conelqueest
Selellama"interfazdelaclase"alosmtodospblicosdelamisma(nonoscansaremosderepetir quelosdatosnodebensernuncapblicos),e"implementacin delaclase"alrestodemtodosya todoslosdatos. Si lo piensabien,el nombrede"interfaz"tienesentido,yaquesuponeel conjuntodemtodosquenos permiteninteractuarconlaclase. Comolosdatosnopuedenserpblicos (yraramente sonprotegidos) debehaberunapartedela losmismos.Enestesentido,enlosltimosaoshaaparecidouna tendencia: interfazqueproporcioneaccesoa
Permitirelusodemtodosconsintaxisdedatos
Muchos lenguajes OOP, como es el caso de Delphi, por ejemplo, permiten indicar que a accedemedianteunmtodo.Normalmenteestoslenguajespermitendefinirun mtodoparaleerelvalordeldato(get)yotromtodoparaestablecerelvalordeldato(set).Esto permitequealutilizarunainstanciadelaclaseparezcaqueseestaccediendoa formadirecta,comosieldatofuerapblico,cuandorealmenteseaccedealmedianteunmtodo. Unavezdefinidalaclase,eselmotorOOPdellenguajeelquehacetodaslasconversionesnecesarias. Por ejemplo, teniendo laclaseCaja, ysuponiendo queparaleerelvalor definidoelmtodogetAltura()yparamodificarelvalordeldatosehadefinidoelmtodosetAltura(); lassiguientesinstruccionesseranconvertidasautomticamenteporellenguaje: Cdigo Caja1.getAltura()+Caja2.getAltura() Caja.setAltura(15) Transformacin Caja1.nAltura+Caja2.Altura Caja1.nAltura=15 un determinadodatose
undatodelacalsede
deldatonAlturaseha
el
queutilizanlenguajes get<nombre>()sonpara