FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
|||
|
|||
Polimorfismo en Delphi5
Hola de nuevo amigos ¡
Estoy intentando crearme una unidad, la cual se basa en una jerarquia de clases, hasta tercer nivel(clases nietas). Para crear los procedimientos que me muestren los datos tengo que usar el polimorfismo. Segun e estado leiendo, todos los procedimientos Mostrar los debo hacer con el mismo numero de parametros, yo e imaginado que una de una clase nieta a otra no debere de ponerle sus variables propias,sin embargo todas las clases padre si deberan de llebar todas las variables de sus hijas (la clase padre de todas me sale con chorro de parametros que no veas). En fin, como podreis observar el polimorfismo no lo tengo nada claro, la cuestion es, partiendo de la base que lo que llebo es correcto, la funcion padre de todas la tendre que declarar virtual y en todas las hijas le tendre que poner Override?? y siendo asi, si una clase ademas de ser hija, es padre a su vez de otras, tendria que ponerle el override y el virtual?? Espero haberme explicado con claridad y gracias por adelantado de nuevo ¡ Salu2 |
#2
|
||||
|
||||
¿Para qué quieres meter todo en parámetros? Declara el método Mostrar con un mínimo de parámetros entendibles para la clase raíz y todos sus descendientes. Cuando trabajes con un objeto de una clase descendiente, lo construyes, asignas valores a sus propiedades (incluidas las de las clases que le antecedan) y luego llamas al método Mostrar.
En resumen: usa propiedades para pasar información a las clases en lugar de tratar de hacerlo através de parámetros de una función. // Saludos |
#3
|
|||
|
|||
polimorfismo
Siento mi ignorancia,pero no e entendido bien eso.
De lo que se trata el problema que tengo que hacer es que yo almaceno los objetos en un Array polimorfico, luego tengo que mostrar esos datos. Lo de los parametros "entendibles", a que te refieres? |
#4
|
||||
|
||||
Así es. Suponte que tienes un arreglo:
Si TObjetoPadre tiene un método virtual Mostrar(...), puedes recorrer polimórficamente el arreglo:
sin importar si algunos de los objetos son de clases descendientes de TObjetoPadre. El polimorfismo consiste en que se escoge el método adecuado dependiendo de la clase real del objeto. Pero Mostrar no puede cambiar de parámetros en los descendientes porque entonces, ¿cuáles de ellos especificarías en el código de arriba? Pero los parámetros de un método (como de cualquier procedimiento) sirven para pasar información. Suponte que originalmente querías algo como:
Es decir, los parámetros P son válidos para TObjetoPadre y todos sus descendientes, los parámetros H son válidos para TObjetoHijo y todos sus descendiente y los parámetros N son válidos para TObjetoNieto y todos sus descendientes. Entonces convierte esos parámetros en propiedades de tus objetos y no pongas parámetros en Mostrar o sólo los de la clase raíz:
Habría que ver cómo llenas el arreglo pero en algún momento tienes que construir los objetos que le pones. Apenas los construyas, les asignas valores a sus propiedades específicas según la clase que se use:
Entonces, el método Mostrar específico de cada clase usara las propiedades como antes usaba los parámetros. Pero ahora Mostar ya no tiene parámetros, es homogéneo para toda la jerarquía de clases y puedes llamarlo polimórficamente sin problemas:
// Saludos Última edición por roman fecha: 08-12-2005 a las 17:49:14. |
#5
|
|||
|
|||
Si lees esto, muchas gracias por la informacion.
Ahora mismo no tngo tiempo para ponerme con esto(me voy al trabajo), lo hare luego a la noche, parece ser que todo el trabajo que e hecho durante estos ultimos 2 dias no vale de nada. El razonamiento que deduje fue que, haciendolo con parametros, todos los procedimientos de todas las clases hijas, nietas, le estaba pasando todos los mismos parametros, luego, dentro de cada procediemiento escogia los que necesitaba y los asignaba a una variable. No se si me explico con claridad, la cuestion es que no me funcionaba, lo unico que funcionaba bien eran los parametros de las clases nietas(los propios), esto si lo visualiza bien, lo demas, solo visualiza el ultimo registro que se haya introducido.Creo que estoy al borde de una depresion con esto....En fin, otra vez mas gracias por esta informacion, ya que difiere de lo poco que me han explicado en clase(no me mencionaron lo de las propiedades, nos dijo el que me da clase que se hace con parametros). Cuando puedas, me gustaria que me dijeses, si este que me da clase me dijo que hay que hacerlo con parametros¿Puedo coger y decirle que no tiene ni idea de Polimorfismo??Salu2 Última edición por dec fecha: 08-12-2005 a las 20:28:40. Razón: ¡¡Encerrad el código fuente entre las etiquetas [DELPHI] ... [/DELPHI]!! |
#6
|
|||
|
|||
Problema resuelto
Hola Roman ¡
Por fin e resuelto el problema, tenia una gran confusion, entre funciones que devuelven un valor, y funciones a las que les paso algun valor (gran problema de base). Al final lo e terminado haciendo con parametros, como me dijeron en clase. E comentado en clase lo de las propiedades, y segun me han dicho, las propiedades se usan mas bien para los objetos visuales. Muchas gracias por todas las molestias ocasionadas. Salu2 |
#7
|
|||
|
|||
Pues no, las propiedades también se usan en objetos "no visuales", como bien te explicó Román.
Es más, en Delphi muchas de las clases son "no visuales" (lease TStringsList, TList, TObjectList, etc) y tienen varias propiedades. Por lo que puede que la persona que te esté dando clases esté algo confundido (esto es por no pensar mal en esa persona... jejeje ) en cuanto a las propiedades. Saludos... |
#8
|
||||
|
||||
Pues a mi me gustaría ver como es que finalmente lo resolviste pues quiero ver en qué parte entra el polimorfismo. Y mira, yo no pretendo, realmente no lo pretendo porque no lo soy, un experto en POO, pero afirmaciones como "las propiedades se usan mas bien para los objetos visuales" carecen realmente de sentido así que toma con reserva lo que ahí te digan.
// Saludos |
#9
|
|||
|
|||
Hola Roman ¡
Te paso la Unit Biblioteca y le hechas un ojo
Tomare en cuenta tu consejo, yo por ahora solo me limito a aprender, llebo solo 1 mes programando en Delphi y es mi primer lenguaje de programacion orientado a objetos que aprendo, la pregunta mas logica es....¿Podria utilizar siempre Propiedades cuando exista una jerarquia de clases? |
#10
|
||||
|
||||
Bien dicen que el hábito no hace al monje. Esto no tienen nada que ver con polimorfismo, es una horrible chapuza para utilizar virtual y override.
Es imperdonable que una clase haga referencia implícita o explícita a datos de sus descendientes. Cada método "virtual" carga con todos los posibles parámetros de la jerarquía. ¿Qué pensará este profesor? Hazle este cuestionamiento: Supongamos que se distribuye el código compilado (dcus) de esta biblioteca sin proporcionar el código fuente. Y supongamos que en un futuro, quienes adquirieron la biblioteca necesitan ampliar la jerarquía añadiendo nuevos descendientes que introducen nuevos atributos. ¿Cómo se puede mantener el "polimorfismo"? Tendríamos que añadir los nuevos parámetros al procedimiento de la clase base. ¡Pero no disponemos del código fuente de la clase base! De paso pregúntale para qué quiere todos esos var que anteceden a los parámetros ya que éstos no se modifican en la rutina. Y en mi opinión, dotar de tantos parámetros a un método no es más que una forma de disfrazar de OOP a una programación procedural a la antigüita. Mal, muy mal. Como te comenté: tómalo con reserva. // Saludos |
#11
|
|||
|
|||
No soy Román pero te contesto.
Si, si se puede hacer. Aquí te pongo como sería tu clase padre usando solamente propiedades:
Ahora, una clase descendiente de TBiblioteca podría ser así:
Ahora, para darle valores a las propiedades de un objeto sería tan fácil como:
Espero que esto te aclare un poco el uso de las propiedades. Saludos... |
#12
|
|||
|
|||
hola muy buenas,quisiera hacer una pregunta por curiosidad: ¿el polimorfirsmo es utilizado con frecuencia en la oop?
gracias de antemano |
#13
|
||||
|
||||
Si te refieres a crear tú tus propias clases pensando polimórficamente para
despues usarlo... pues en casos como estos sip; que dicho sea de paso, es algo frecuente. Usarlo de forma insconciente, o sin darte cuenta.... pues mucho más de lo que crees, aunque no he mirado la VCL a fondo para comprobarlo, estoy muy seguro de que internamente Delphi usa el concepto, ya que da mucha libertad. Declaras una variable como Tcomponent y despues puedes asignarle un descendiente que tenga la clase. -Un caso común es acceder a FindComponent para encontrar un determinado control en el form en tiempo de ejecución. FindComponent busca un Tcomponent, pero puede ser un TEdit, Tpanel o cualquiera que sea descendiente, que en realidad lo serán casi todos los controles que tienes en un Form. - Realizar un bucle sobre todos los TEdits con FormX.Components[i]. (más de lo mismo), cada boton o panel, se trata como si fuera un Tcomponent, que es la clase base para ambos controles que he mencionado. - Incluso recorrer todos los campos que tiene una tabla, tú trabajas con Tfield, pero el campo en cuestión puede ser un TIntegerfield, TFloatField, etc., que son clases hijas de TField. Esto mismo se podría hacer sin uso del polimorfismo, pero no cabe duda que ahorras lineas de código de esta forma, amén de usar una característica muy potente del lenguage. Moraleja: Es importante aprender los conceptos y practicar tanto con polimorfismo, herencia, etc. saludos y espero te sirva. saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente, se lo volveré a explicar hasta que no lo entienda, Gracias. Última edición por Lepe fecha: 14-12-2005 a las 21:37:55. |
#14
|
|||
|
|||
si que me ha servido,gracias
a ver como resumo todo este tema en clase,jeje |
#15
|
|||
|
|||
polimorfismo
Hola amigos ¡
Me e estado pensando si comentaros, pero la verdad, me e decidido a hacerlo. Expuse todo este tema en clase, y el profesor(por llamarle de alguna manera) solo se reitero. Las propiedades son para los objetos visuales, con los metodos que habeis escrito en todo este hilo, segun el no estan los datos encapsulados, resumiendo, segun esta persona todo lo que hay escrito en este hilo es la "tipica basura que nos podemos encontrar por Internet". Yo, visto lo visto, pienso que es mejor que me lo mire por mi cuenta. Sabeis de algun manual sobre DELPI que merezca la pena?GRacias por adelantado. |
#16
|
|||
|
|||
Cita:
Lo único triste del caso es que tus demás compañeros se queden con lo que les está "enseñando" su "maestro". Cita:
También te puedes bajar el libro de la Cara Oculta de Delphi 4, el link no lo tengo a la mano pero no faltará quien te lo proporcione. Saludos... |
#17
|
||||
|
||||
Cita:
Para no repetir lo dicho por otros compañeros; simplemente Escribe TStringList en el editor de código de delphi, mantén la tecla CTRL presionada y haz clic sobre la palabra. Irás al código fuente de Delphi y comprobarás por tí mismo que Delphi usa propiedades para todo. Puedes mirar libremente cómo está hecho delphi internamente, todos los controles y todas las Clases, y por supuesto, se usan propiedades. Si "tenemos que darle la razón a tu profesor" tendríamos que poner en entredicho uno de los mejores Lenguajes de programación existentes, cuya robustez, eficiencia y filosofía de POO ha sido más que demostrada y alabada. Y habría que ponerlo en entredicho porque todas las clases tienen propiedades, sea un control visual o no. Tú decides quien lleva razón... si éste foro de internet.... o tu profesor . Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente, se lo volveré a explicar hasta que no lo entienda, Gracias. |
|
|
|