Download - Herencia en Java, Con Ejemplos - Jarroba

Transcript
  • 22/3/2015 HerenciaenJava,conejemplosJarroba

    data:text/htmlcharset=utf8,%3Ch1%20class%3D%22textcenter%22%20style%3D%22boxsizing%3A%20borderbox%3B%20margin%3A%200px%200 1/9

    HerenciaenJava,conejemplos

    ElproyectodeestepostlopuedesdescargarpulsandoAQUI.

    LaHerenciaesunodelos4pilaresdelaprogramacinorientadaaobjetos(POO)juntoconla Abstraccin, Encapsulacin yPolimorfismo. Al principio cuesta un poco entender estosconceptos caractersticos del paradigma de la POO porque solemos venir de otro paradigma deprogramacin comoel paradigmade la programacinestructurada (ver la entradaParadigmas deProgramacin),perosehadedecirquelacomplejidadestenentenderestenuevoparadigmaynoenotracosa.Enestaentradavamosaexplicardelamejormaneraposiblequeeslaherenciaylovamosaexplicarconunejemplo.

    Respectoalaherenciasehandadomuchasdefinicionescomoporejemplolasiguiente:Laherenciaesunmecanismoquepermiteladefinicindeunaclaseapartirdeladefinicindeotrayaexistente.Laherenciapermitecompartirautomticamentemtodosydatosentreclases,subclasesyobjetos.. As de primeras esta definicin es un poco difcil de digerir para aquellos que estisempezandoconlaPOO,asquevamosa intentardigerirestadefinicinconunejemploenelqueveremosquelaherencianoesmsqueunCopyPasteDinmicoounaformadesacar factorcomnalcdigoqueescribimos.

    Elejemploqueproponemosesuncasoenelquevamosasimularelcomportamientoquetendranlosdiferentesintegrantesdelaseleccinespaoladefutbol tantolosFutbolistascomoelcuerpotcnico(Entrenadores,Masajistas,etc).ParasimularestecomportamientovamosadefinirtresclasesquevanarepresentaranaobjetosFutbolista,EntrenadoryMasajista.Decadaunosdeellosvamosanecesitaralgunosdatosquereflejaremosen losatributos yunaseriedeaccionesque reflejaremos en sus mtodos. Estos atributos y mtodos los mostramos en el siguientediagramadeclases:

  • 22/3/2015 HerenciaenJava,conejemplosJarroba

    data:text/htmlcharset=utf8,%3Ch1%20class%3D%22textcenter%22%20style%3D%22boxsizing%3A%20borderbox%3B%20margin%3A%200px%200 2/9

    NOTA:enestediagramayenadelantenovamosaponerlosconstructoresymtodosgetterysetterconelfindequeeldiagramanosquedegrandeeintendibleaunqueenunbuendiagramadeclasesdeberanaparecerpararespetarelprincipiodeencapsulacindelaPOO

    Comosepuedeobservar,vemosqueen las tresclasestenemosatributosymtodosquecon igualesyaque lostrestienen losatributosid,Nombre,ApellidosyEdad y los tres tienen losmtodosdeViajaryConcentrarse:

    Aniveldecdigotenemoslosiguientetrasvereldiagramadeclases:

    publicclassFutbolista{

    privateintid; privateStringNombre; privateStringApellidos; privateintEdad; privateintdorsal; privateStringdemarcacion;

    //constructor,getterysetter

    publicvoidConcentrarse()

    publicclassEntrenador{

    privateintid; privateStringNombre; privateStringApellidos; privateintEdad; privateStringidFederacion;

    //constructor,getterysetter

    publicvoidConcentrarse(){

    publicclassMasajista{

    privateintid; privateStringNombre; privateStringApellidos; privateintEdad; privateStringTitulacion; privateintaniosExperiencia;

    //constructor,getterysetter

    publicvoidConcentrarse(){

  • 22/3/2015 HerenciaenJava,conejemplosJarroba

    data:text/htmlcharset=utf8,%3Ch1%20class%3D%22textcenter%22%20style%3D%22boxsizing%3A%20borderbox%3B%20margin%3A%200px%200 3/9

    { ... }

    publicvoidViajar(){ ... }

    publicvoidjugarPartido(){ ... }

    publicvoidentrenar(){ ... }}

    ... }

    publicvoidViajar(){ ... }

    publicvoiddirigirPartido(){ ... }

    publicvoiddirigirEntreno(){ ... }}

    ... }

    publicvoidViajar(){ ... }

    publicvoiddarMasaje(){ ... }}

    Loquepodemosverenestepuntoesqueestamosescribiendomuchocdigorepetidoyaquelastresclasestienenmtodosyatributoscomunes,deahiycomoveremosenseguida,decimosquelaherenciaconsisteensacarfactorcomnparanoescribircdigodems,portantoloqueharemosseracrearnosunaclaseconelcdigoqueescomnalastresclases(aestaclasese le denomina en la herencia como Clase Padre o SuperClase) y el cdigo que esespecificodecadaclase,lodejaremosenella,siendodenominadasestasclasescomoClasesHijas, las cuales heredan de la clase padre todos los atributos y mtodos pblicos oprotegidos.Esmuyimportantedecirquelasclaseshijasnovanaheredarnuncalosatributosymtodosprivadosdelaclasepadre,asquemuchocuidadoconesto.Enresumenparaqueveislaventajadelaherencia,tenemosahoraunaclasepadreconnlineasdecdigoytresclaseshijascona, by c lineasdecdigosrespectivamente,portantosihechiscuentas,hemosreducidonuestro cdigo en 2n lneas menos ya que antes tenamos (n+a)+(n+b)+(n+c) lneas decdigoyahora trasaplicarherencia tenemos n+a+b+c lneas,aunque tambinesciertoquetenemosunaclasems,peroveremosunpocomsadelantelaventajadeteneresaclasepadre.Enresumen,alsacarfactorcomnyaplicarherencia,tenemoslassiguientesclases:

  • 22/3/2015 HerenciaenJava,conejemplosJarroba

    data:text/htmlcharset=utf8,%3Ch1%20class%3D%22textcenter%22%20style%3D%22boxsizing%3A%20borderbox%3B%20margin%3A%200px%200 4/9

    Aniveldecdigo,lasclasesquedaranimplementadasdelasiguienteforma:

    publicclassSeleccionFutbol{

    protectedintid; protectedStringNombre; protectedStringApellidos; protectedintEdad;

    //constructor,getterysetter

    publicvoidConcentrarse(){ ...

  • 22/3/2015 HerenciaenJava,conejemplosJarroba

    data:text/htmlcharset=utf8,%3Ch1%20class%3D%22textcenter%22%20style%3D%22boxsizing%3A%20borderbox%3B%20margin%3A%200px%200 5/9

    }

    publicvoidViajar(){ ... }}

    publicclassFutbolistaextendsSeleccionFutbol{ privateintdorsal; privateStringdemarcacion;

    publicFutbolista(){ super(); }

    //getterysetter

    publicvoidjugarPartido(){ ... }

    publicvoidentrenar(){ ... }}

    publicclassEntrenadorextendsSeleccionFutbol{

    privateStringidFederacion;

    publicEntrenador(){ super(); }

    //getterysetter

    publicvoiddirigirPartido(){ ... }

    publicvoiddirigirEntreno(){ ... }}

    publicclassMasajistaextendsSeleccionFutbol{

    privateStringTitulacion; privateintaniosExperiencia;

    publicMasajista(){ super(); }

    //getterysetter

    publicvoiddarMasaje(){ ... }}

    Comopodis observar ahora queda uncdigomuchoms limpio, estructurado y conmenoslneasdecdigo,loquelohacemslegible,cosaqueesmuyimportanteyloquetodavalohacems importanteesqueesuncdigoreutilizable, loquesignificaqueahorasiqueremosaadir ms clases a nuestra aplicacin como por ejemplo una claseMdico, Utiller@, Jefe/a deprensaetc.quepertenezcantambinalequipotcnicodelaseleccinEspaola,lopodemoshacerdeformamuysencillayaqueen laclasepadre(SeleccionFutbol) tenemos implementadopartedesusdatosydesucomportamientoysolohabrqueimplementarlosatributosymtodospropiosde

  • 22/3/2015 HerenciaenJava,conejemplosJarroba

    data:text/htmlcharset=utf8,%3Ch1%20class%3D%22textcenter%22%20style%3D%22boxsizing%3A%20borderbox%3B%20margin%3A%200px%200 6/9

    esaclase.Empezisaverlautilidaddelaherencia?.

    Ahorasioshabisfijadobienenelcdigoquesehaescritoysinohabistenidoexperienciacon la herencia en Java, habris podido observar dos palabras reservadas nuevas como sonextends,protectedysuper.Puesbien,ahoravamosaexplicarelsignificadodeellas:

    extends:Estapalabrareservada,indicaalaclasehijacualvaasersuclasepadre,esdecirque por ejemplo en la clase Futbolista al poner public class Futbolista extendsSeleccionFutbol leestamos indicandoa laclase Futbolistaquesuclasepadrees laclaseSeleccionFutbolodichodeotramaneraparaqueseentiendamejor,alponerestoestamoshaciendoun copypastedinmicodiciendoa laclase Futbolistaquese copie todos losatributos ymtodos pblicos o protegidos de la clase SeleccionFutbol. De aqu viene esadefinicinquedimosdequelaherenciaenuncopypastedinmico.protected:sirveparaindicaruntipodevisibilidaddelosatributosymtodosdelaclasepadrey significa que cuando un atributo es protected o protegido, solo es visible ese atributo omtododesdeunadelasclaseshijasynodesdeotraclase.super: sirve para llamar al constructor de la clase padre. Quizs en el cdigo que hemospuestonosehavistomuybien,peroacontinuacinlomostramosdeformasmsclara,viendoelconstructordelosobjetospasndolelosatributos:

    publicclassSeleccionFutbol{

    ......

    publicSeleccionFutbol(){ }

    publicSeleccionFutbol(intid,Stringnombre,Stringapellidos,intedad){ this.id=id; this.Nombre=nombre; this.Apellidos=apellidos; this.Edad=edad; } ......

    publicclassFutbolistaextendsSeleccionFutbol{ ...... publicFutbolista(){ super(); }

    publicFutbolista(intid,Stringnombre,Stringapellidos,intedad,intdorsal,Stringdemarcacion){ super(id,nombre,apellidos,edad); this.dorsal=dorsal; this.demarcacion=demarcacion; } ......

  • 22/3/2015 HerenciaenJava,conejemplosJarroba

    data:text/htmlcharset=utf8,%3Ch1%20class%3D%22textcenter%22%20style%3D%22boxsizing%3A%20borderbox%3B%20margin%3A%200px%200 7/9

    Hastaaqutodocorrecto,peroahoravamosavercomotrabajamosconestasclases.Paravereste funcionamientode formaclaraysencillavamosa trabajarconunobjetodecadaclaseyvamosavercomosecreanydequeformaejecutansusmtodo.Paraelloempecemosmostrandoelsiguientefragmentodecdigo:

    publicclassMain{

    //ArrayListdeobjetosSeleccionFutbol.Idenpendientementedelaclasehijaalaquepertenezcaelobjeto publicstaticArrayListintegrantes=newArrayList();

    publicstaticvoidmain(String[]args){

    EntrenadordelBosque=newEntrenador(1,"Vicente","DelBosque",60,"284EZ89"); Futbolistainiesta=newFutbolista(2,"Andres","Iniesta",29,6,"InteriorDerecho"); MasajistaraulMartinez=newMasajista(3,"Ral","Martinez",41,"LicenciadoenFisioterapia",18);

    integrantes.add(delBosque); integrantes.add(iniesta); integrantes.add(raulMartinez);

    //CONCENTRACION System.out.println("Todoslosintegrantescomienzanunaconcentracion.(Todosejecutanelmismomtodo)"); for(SeleccionFutbolintegrante:integrantes){ System.out.print(integrante.getNombre()+""+integrante.getApellidos()+">"); integrante.Concentrarse(); }

    //VIAJE System.out.println("nTodoslosintegrantesviajanparajugarunpartido.(Todosejecutanelmismomtodo)"); for(SeleccionFutbolintegrante:integrantes){ System.out.print(integrante.getNombre()+""+integrante.getApellidos()+">"); integrante.Viajar(); } ......

    Loprimeroquevemosesquenoscreamosunobjetodecadaclase,pasndolelosatributosalconstructorcomoparmetroydespussorprendentementelosmetemosenunArrayListdeobjetosde la clase SeleccionFutbolque es la clase padre.Esto evidentemente te lo permitehaceryaquetodoslosobjetossonhijosdelamismaclasepadre.Luegocomoveis,recorremosel

  • 22/3/2015 HerenciaenJava,conejemplosJarroba

    data:text/htmlcharset=utf8,%3Ch1%20class%3D%22textcenter%22%20style%3D%22boxsizing%3A%20borderbox%3B%20margin%3A%200px%200 8/9

    ArrayListyejecutamossusmtodoscomunescomosonelConcentrarseyelViajar.Estecdigodacomosalidalosiguiente:

    Todoslosintegrantescomienzanunaconcentracion.(Todosejecutanelmismomtodo)VicenteDelBosque>ConcentrarseAndresIniesta>ConcentrarseRalMartinez>Concentrarse

    Todoslosintegrantesviajanparajugarunpartido.(Todosejecutanelmismomtodo)VicenteDelBosque>ViajarAndresIniesta>ViajarRalMartinez>Viajar

    Comoveisalejecutar todoselmismomtodode laclasepadreelcdigopuesto funcionacorrectamente.

    Posteriormentevamosaejecutarcdigoespecificodelasclaseshijas,deahiqueahoranopodamosrecorrerelArrayListyejecutarelmismomtodoparatodoslosobjetosyaqueahoraesosobjetossonnicosdelaclaseshijas.Elcdigoeselsiguiente:

    //ENTRENAMIENTOSystem.out.println("nEntrenamiento:Solamenteelentrenadoryelfutbolistatienemetodosparaentrenar:");System.out.print(delBosque.getNombre()+""+delBosque.getApellidos()+">");delBosque.dirigirEntrenamiento();System.out.print(iniesta.getNombre()+""+iniesta.getApellidos()+">");iniesta.entrenar();

    //MASAJESystem.out.println("nMasaje:Soloelmasajistatieneelmtodoparadarunmasaje:");System.out.print(raulMartinez.getNombre()+""+raulMartinez.getApellidos()+">");raulMartinez.darMasaje();

    //PARTIDODEFUTBOLSystem.out.println("nPartidodeFtbol:Solamenteelentrenadoryelfutbolistatienemetodosparaelpartidodeftbol:");System.out.print(delBosque.getNombre()+""+delBosque.getApellidos()+">");delBosque.dirigirPartido();System.out.print(iniesta.getNombre()+""+iniesta.getApellidos()+">");iniesta.jugarPartido();

    Como vemos aunque el entrenador y los futbolistas asistan a un entrenamiento, los dos

  • 22/3/2015 HerenciaenJava,conejemplosJarroba

    data:text/htmlcharset=utf8,%3Ch1%20class%3D%22textcenter%22%20style%3D%22boxsizing%3A%20borderbox%3B%20margin%3A%200px%200 9/9

    hacenunafuncindiferenteenelmismo,portantohayquehacermtodosdiferenteparacadaunade las clases. Ya veremos cuando hablemos del polimorfismo que podremos ejecutar el mismomtodoparaclasesdiferentesyqueesosmtodoshagancosasdistintas.Comoresultadoalcdigomostradotenemoslosiguiente:

    Entrenamiento:Solamenteelentrenadoryelfutbolistatienemetodosparaentrenar:VicenteDelBosque>DirigeunentrenamientoAndresIniesta>Entrena

    Masaje:Soloelmasajistatieneelmtodoparadarunmasaje:RalMartinez>Daunmasaje

    PartidodeFtbol:Solamenteelentrenadoryelfutbolistatienemetodosparaelpartidodeftbol:VicenteDelBosque>DirigeunpartidoAndresIniesta>Juegaunpartido

    CONCLUSIONESYACLARACIONES:Estohasido todo loquehemoscontadosobre laherenciaenestaentrada.El temade la

    herenciaesuntemaquepuedeserunpocomscomplejodeloquelohemoscontadoaqu,yaquesolohemoscontadoloqueeslaherenciasimple(yaqueJavaporelmomentoeselnicotipodeherenciaquesoporta)ynolaherenciamltiple,queesuntipodeherenciaenlaqueunaclasehijapuedetenervariospadres,aunqueporelmomentosiestisempezandoaaprenderelconceptodelaherencia,con laherenciasimple tenismsquesuficiente.Para losqueosestis iniciandoenelmundode la ingeniera informtica,habrispodidoverquehemospuestounosejemplomostrandounosdiagramasunpocorarospuesbien,estosdiagramassellamandiagramasdeclases(queloshemos realizado con la herramienta web dewww.genmymodel.com) y sirven para representar deformagrficalosatributosymtodosdelasclasesylasrelacionesentreellos,utilizandoellenguajeUMLdelcualintentaremoshablarmsadelanteenotrostutoriales.Porltimodeciryaclararqueenestaentradaquizsnohemosutilizadounaterminologacorrectaparaexplicarlaherencia,perolohemosexplicadodeunaformaalgodistintaacomoestaexplicadaporahiparaquelosqueempeceispodaisentenderlaherenciadesdeotropuntodevista.