Sunteți pe pagina 1din 15

UNIVERSIDADDECORDOBA FACULTADDECIENCIASBASICASEINGENIERIAS PROGRAMAINGENIERIADESISTEMAS CURSO:ElectivadeprofundizacinI(desarrollodesoftwarelibre) TEMA:HerenciaypolimorfismoenC#.

DESCRIPCION: Desarrollo practico del tema de la herencia y el polimorfismo en C#, abordandoaspectosdellenguajecomolaimplementacindeclases,reasdevisibilidad, declaracindepropiedades,sintaxisparadefinirlaherencia,clasesabstractasymtodos polimrficosdeltiposabstracto,virtualysobreescritousandoparaellounaaplicacinde consola.Eldocumentopresentaalrespectolospasosnecesariosparacrear,compilary ejecutar una aplicacin de consola desde el entorno de desarrollo integrado (IDE) MonoDevelopenLinuxparaellenguajeC#. OBJETIVO: Disear e implementar en el lenguaje C# una jerarqua de clases para ejemplificarconunaaplicacindeconsolalosconceptosdeherenciaypolimorfismoen este lenguaje integrando conceptos nuevos de orientacin a objetos como el uso de propiedades,especificandolospasosparaconstruir,compilaryejecutarlaaplicacinen elentornodedesarrolloMonoDevelop. PALABRASCLAVES:DiseodeclasesUML,HerenciaypolimorfismoenC#,mtodos virtuales, abstractos y sobreescritos en C#, desarrollo de aplicaciones de consola en MonoDevelop. DESARROLLO:Acontinuacinsepresentaundiagramadeclasesenelqueseilustra unajerarquadeclasesquepermitenrealizarlascuatrooperacionesbsicasentredos nmerosenteros,empleadoparaellounaclaseabstractaqueserdeclasepadreyenla quelosdosnmerossemodelanconelconceptodepropiedad,ademssepresentarala formadetrabajodeC#conrelacinalosmtodospolimrficosyelllamadodemtodos delaclasepadredesdemtodosdelaclasehijaconelapuntadorbase.

Lic. Luis Roberto Olascoaga Surmay

Diagramadeclases Elsiguientediagramadeclasesilustralasclases necesarias paraelejemploconuna relacindeherenciaentrelaclasepadreobaseTNumeros(queesabstracta),susclases hijas correspondientes a cada una de las cuatro operaciones bsicas. Observe la convencin seguida en el diseo para expresar conceptos de orientacin a objetos propiosdellenguajeC#,comosonloscasosdelaspropiedades,losmtodosvirtuales, abstractosysobreescrito.NotequeelmtodoMostrar()delaclasepadreTNumerosno esobligadoimplementarloporlasclasehijas,porellolaclaseTRestanolohaceaunque lasotrassilosobreescribe,estedetalleseexplicamasadelante.

Lic. Luis Roberto Olascoaga Surmay

Implementacin. 1. EntrarenMonodevelop:Aplicaciones+programacin+Monodevelop

ElIDE(entornodedesarrollointegrado)demonodevelopescomosigue:

2. Crearunanuevasolucin:Archivo+nuevo+solucin.

Lic. Luis Roberto Olascoaga Surmay

Conloquesedespliegalasiguienteventana,enlaquedelnodoC#delalistaplantilla seleccionamos la opcin proyecto de consola. Seguidamente asigne un nombre al proyecto (para el caso ejemplo1) y de forma opcional seleccione un directorio para guardarelproyectoconsusarchivosrespectivos,usandoparaelloelbotnexaminar.Si marcalaopcincrearsubdirectoriodesolucinporseparado,MonoDevelopcrearaun directorioaparteconelmismonombredelasolucinparacontenerenelloslosarchivos decdigofuentedeclase(.cs)quecuelgadentrodeldirectorio(raz)delasolucin,enel quevanlosarchivosdeproyectoyconfiguracin.Seguidamentepulseelbotnadelante.

3. Posteriormente se presenta una ventana en la que puede aadir otros proyectos adicionalesalasolucin,loscualessoncompletamenteopcionales.Asporejemplo tenemoslaopcinparasoporteGTK#,lacualesempleadaporlasaplicacionesque tendrnunainterfazgraficadeusuario(GUI)endondedesarrollamosconventanasy eventos.Igualmentevemoslaopcinpara unproyectodetraduccin,conelfinde creararchivosnecesariosquepermitancambiardurantelaejecucindelprogramanel

Lic. Luis Roberto Olascoaga Surmay

idioma de la interfaz del usuario, incluido los posibles mensajes de texto que se presentenalusuariofinal. Para este caso ninguna de estas opciones son necesarias y por ello no debe marcarlas. En la ventana siguiente se observan estas opciones y se aprecia una descripcinbastanteclaraalrespecto.

4. Lasiguientepantallailustraelestadoinicialdelasolucin,dondeenelpanelizquierdo vemoselinspectordelasolucin,mostrandolasreferencias(ensambladosexternos) ylasclasesquecomponenelproyecto,paraestecasoelarchivoprincipalMain.cs quecontienelaclaseMainClasspresentadaenelpaneldeladerecha.Enestese apreciaqueladefinicindelaclaseseencuentradentrodeunnombredeespacio (namespace)llamadoejemplo1,queesmismonombredelasolucin.Laclasetiene pordefectounnicomtodoqueespblico,esttico(static),tipovoidllamadoMainy que recibe por parmetro un vector de cadenas de caracteres (Qu representan estosparmetros?).

Lic. Luis Roberto Olascoaga Surmay

Enesteejercicionoesnecesariousarlosnombresdeespacio,porlotantoentodos losarchivosdeclasequecrearemosincluidoeldelaclaseprincipal,quitaremosla declaracindelnombredeespacioylallavedeapertura{ycierredeesta}.Antesde ver el cdigo de esta clase, construiremos otras clases con sus correspondientes archivosdecdigofuente(.cs) 5. Anadirunanuevaclase:Clickderechoenelnombredelasolucin(ejemplo1)+aadir +nuevoarchivo.

6. Enlasiguienteventanaseleccionedelpaneldelaizquierdalaopcingeneral,luego

del panel de laderecha marque clase vaca y finalmente ingreseel nombrede la clase,paraestecasoserTNumeros.Finalmentepulseelbotnnuevo.

Lic. Luis Roberto Olascoaga Surmay

La pantalla de abajo ilustra el esqueleto de la clase TNumeros recin creada que seguidamenteprocederemosacompletar.

7. Implemente la clase TNumeros como indica en la pantalla de abajo, siguiendo la sugerencia anteriormente sealada borrando el nombre de espacio. En C# el constructor de una clase tiene el mismo nombre de la clase, una visibilidad (normalmentepublica)peronoseindicaningntipoderetornonisiquieravoid.Enla implementacin del constructor, se inicia los dos atributos a cero y se imprimeun mensajeindicandoqueseestaejecutandoelconstructordelaclasepadre,estonoes necesario para la funcionalidad de la clase, solo se ha incluido para que usted compruebequeconstructoresseutilizanencadaobjetoinicializado.Estaclasecomo caractersticasprincipalestienequeesabstractaporlocualseprecedesudeclaracin de la palabra reservada abstract. Esta clase declara dos atributos ambos de tipo entero,paradefinirposteriormenteconellosdospropiedadesdelmismotipo,tantoel nombredelatributocomoeldelapropiedad soloobedecenaunaconvencin; de modoquealosatributosselesasignaunnombrequeempiezaporlaletraF(deField ocampo)ylapropiedadtendrelmismonombredelatributoperosinlaletraFinicial deste.

Lic. Luis Roberto Olascoaga Surmay

Comopuedeobservarseenlaimagenquesigueabajo,ladefinicindeunapropiedad es similar a la de un mtodo con la salvedad que no se indican parntesis ni parmetros para la propiedad. Aprecie adems que los mtodos que proveen el encapsuladoseincluyenenelcuerpodelapropiedaddentrodelasllaves{}deesta. Estos mtodos como es habitual son el modificador (set) y el selector (get). Una

Lic. Luis Roberto Olascoaga Surmay

propiedadenesteordendeideas,esentoncesunaformadeaccesoindirectoalos atributos,pueslapropiedad sehacepblica, elatributorelacionadoconellasigue siendoprivadoycuandoseleasignaunvaloralapropiedadesteescapturadode maneraautomticaenlavariablereservadallamadavalue,esasignadoalatributopor elmtodoset.Cuandoserequiereusarelvalordelapropiedad,estevalorsetoma delvalordelatributoyseretornaconlasentencia return enlaimplementacindel mtodo get. La clase tiene un mtodo abstracto (que carece de implementacin) llamadoOperacion()yotrovirtualllamadoMostrar()quepuedesersobreescritopor lasclaseshijasyqueesusadoparapresentarenpantallaelresultadodelaoperacin entrelosdosnmeros. 8. Siguiendolospasos5y6creeunanuevaclasellamadaTSumaqueheredadela claseabstractaTNumeros;locualenlasintaxisdeC#seindicaponiendodospuntos (:)despusdelnombredelaclasehija(TSuma)seguidodelnombredelaclasepadre (TNumeros),comoseapreciaseguidamente:

Enlaimplementacindelconstructorvemoslasentencia: base(),quesignificaque antesdedeejecutarelconstructordelaclasehijasevaaejecutarelconstructordela clasepadre.Esteconstructorenlaclasehijasolomuestraunmensajeindicandoel tipodehijo.PorelloalcrearunobjetodelaclaseTSumasemuestrandosmensajes, elqueyaindicamosenlaclasepadreseguidodelquevemosenlapresentepantalla.

Lic. Luis Roberto Olascoaga Surmay

Al heredar de una clase abstracta, la clase TSuma debe implementar todos los mtodosabstractos heredados, para elcaso se tratadel mtodo Operacion(), que debeserdefinidodeidnticaformaacomovienedelaclasepadre;esdecirconel mismonombre,mismavisibilidad,idnticotipoderesultadoeiguallistadeparmetros tanto en tipo, orden y cantidad. Cuando una clase hija implementa un mtodo abstractosedebeusarlapalabrareservadaoverride(sobreescrito)enelmomento enquese declaraelmtodoyestavezdichomtododebeteneruncuerpo,una implementacin.ParaelcasolaclaseTSumasimplementeretornalasumadelasdos propiedades Num1 + Num2. Por qu no se implemento como return FNum1+FNum2? ElmtodoMostrar()enlaclasepadrefuedeclaradocomovirtual,loquesignificaque tiene una implementacin pero puede ser sobre escrito por la clase hija, por ello tambinestaprecedidoporlapalabrareservadaoverride.Enlaimplementacindel mtodoMostrar()delaclasehijavemosquemostramoslosdosnmerosseparados porelsignodelaoperacinyluegoinvocamos(ejecutamos)laimplementacindela clasepadreparaestemismomtodo,locualsehaceusandonuevamentelapalabra reservada base,estavezindicandoelnombredelmtododelaclasepadrequese quiereejecutar.Estamismatcnicasepuedeaplicarparacualquiercasoendonde requerimos ejecutar la implementacin de un mtodo de la clase padre desde la implementacindeunmtododelaclasehija,ojosinimportarqueestosmtodosno seanlosmismos(encuantoasunombre).Qusucedesienlaimplementacindel mtodomostrar()nopusiramosbase.?

Lic. Luis Roberto Olascoaga Surmay

9. Siguiendolospasos5y6creeunanuevaclasellamadaTRestayasegresedeque suimplementacinseacomosigue:

10. ConstruyalasclasesTProductoconelcdigocomosigue:

Lic. Luis Roberto Olascoaga Surmay

11. ConstruyalasclasesTCocienteeimplemntelacomosigue:

12. PasealarchivoMain.csyasegresedequelaimplementacindelaclaseprincipal (MainClass)quedecomosigue:

Enestaclasevemosquelosmtodossonestticos(static)(Porquambosdeben serestticos?).ElprimerodeelloselmtodoEjecutar()recibeporparmetrouna instancia(objeto)delaclaseabstractaTNumeros(Porqusisesuponequeuna

Lic. Luis Roberto Olascoaga Surmay

claseabstractapordefinicinnopuedeserinstanciada?),aesteobjetoseleasigna valoresasusdospropiedadespidiendoestosporconsolayleyndolosporteclado, haciendo la conversin de la cadena de caracteres recibida del mtodo Console.ReadLine()usandoelmtodoestticoParse()deltipoint.(Acasointnoes untipodedatosprimitivoyporquentoncestienemtodos?).Finalmentesellamaal mtodomostrar. EncuantoalaimplementacindelmtodoMainvemosquesehacenllamadosdel mtodoEjecutar()pasandoinstanciasinicializadasconnewyelconstructorrespectivo de cada clase hija (Por qu se puede pasar una instancia de clase hija en un parmetrocuyotipoesclasepadre?) 13. Paracompilarelprogramavayaporlaopcinconstruir+construirsolucionopulsela teclaF8. 14. Paraejecutarelprograma,comoesdeconsolaprimeroentreporlaopcinproyecto+ opcionescomosiindicaaqu:

Lic. Luis Roberto Olascoaga Surmay

15. Enlaventanadesplegadahagaclickenelnodoejecutardelpaneldelaizquierday luego maque la casilla de verificacin etiquetada como ejecutar en una consola externa.EstosehaceparaqueelprogramaejecutelasentenciaConsole.ReadLine() deformacorrecta.Finalmentepulseelbotnaceptar.

16. Paraejecutarelprogramaahorapulseelbotndepurarovayaporlaopcinejecutar +ejecutaropulselateclaF5.

Lic. Luis Roberto Olascoaga Surmay

Actividadpropuesta. Comocomplementedelanteriorejerciciodesarrollelassiguientesactividades. 1. Resuelva con sustentacin las preguntas realizadas a lo largo de los apartados anteriores. 2. Que papel cumple el puntero this a nivel de la implementacin y el llamado de constructoressobrecargadosdesdeotrosconstructoresdelamismaclase?.Ilustre conunejemplo. 3. Plantee una solucin posible para el caso en que desde la implementacin de un constructordeunaclasehijarequiriramosejecutarunconstructordelaclasepadre perodespusdehaberejecutadoparteotodoelcdigopropiodelconstructordela clasehija.Tomeencuentaqueelusodebaseaniveldelconstructordelaclasehija no sirve en esta situacin, pues el uso de este sugiere una llamada implcita del constructordelaclasepadreantesdeejecutarlaprimerainstruccindelconstructor de la clase hija. Realice un ejemplo que implemente y demuestre que la solucin propuestafuncionacorrectamente. 4. Diseeeincluyaeneldiagramalasclasesnecesariasparaampliarlafuncionalidadde laaplicacincreandoeimplementandodichasclases,demodoqueestapermita: a. CalcularelMCDdedosnmerosenteros. b. CalcularelMCMdedosnmerosenteros. c. Representar un nmero complejo con su parte real y su parte imaginaria, suponiendoqueambasestndadasporunnmeroentero.Sehacenecesario contarconunmtodoqueimprimaelnumerocomplejodelaformabinomial, porejemplo3+4i. d. Calcularlasumadelostrminosdelasucesindefibonaccicomprendidos entredostrminosdelosqueseconocesuordenoposicin(ojonoelvalor deltermino),porejemplolasumadelostrminosquevandel3al10(note que no se indica el valor del termino sino su posicin, el valor debe ser calculadodurantelaoperacin).

Lic. Luis Roberto Olascoaga Surmay

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