![]() |
![]() |
| Paypal | FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
|||||||
| Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
![]() |
|
|
Herramientas | Buscar en Tema | Desplegado |
|
|
|
#1
|
|||||||
|
|||||||
|
¡Hola!
Cita:
Pero para profundizar en ello, creo que sería muy útil que nos dieras a conocer al menos un ejemplo real y concreto de esta situación, incluyendo un poco de código (incluso seudo código de cómo lo visualizas ya terminado), algo de la aplicación que estás programando y de cómo fue que te topaste con esta idea. Vaya, me imagino diciéndonos algo como: Cita:
Cita:
![]() Cita:
![]() Cita:
Cita:
Cita:
He creado las funciones Redefine con conocimiento de causa, y el algoritmo que utilizo en RedefineProc2 es totalmente seguro para cualquier método virtual, incluso si éste fuese abstracto. Si tienes dudas sobre lo que hacen algunas partes o sentencias concretas del código que escribí, exprésalas con confianza. Pero reitero la invitación que te hago al principio de este mensaje (exponer el caso que da origen a la necesidad planteada). Un saludo. Al González. ![]()
__________________
Tras casi seis años de trabajar para una empresa alemana como desarrollador Delphi, se vieron forzados a dejarme ir (temas presupuestales). Así que ahora estoy abierto a escuchar nuevas ofertas. Última edición por Al González fecha: 05-02-2009 a las 18:16:14. |
|
#2
|
|||
|
|||
|
Cita:
|
|
#3
|
||||
|
||||
|
Cita:
Cita:
![]()
__________________
Tras casi seis años de trabajar para una empresa alemana como desarrollador Delphi, se vieron forzados a dejarme ir (temas presupuestales). Así que ahora estoy abierto a escuchar nuevas ofertas. |
|
#4
|
||||
|
||||
|
¡Hola!
Saliéndome un poco del tema y sobre esto que comenté anteriormente: Cita:
http://www.clubdelphi.com/foros/showthread.php?t=63840
__________________
Tras casi seis años de trabajar para una empresa alemana como desarrollador Delphi, se vieron forzados a dejarme ir (temas presupuestales). Así que ahora estoy abierto a escuchar nuevas ofertas. Última edición por Al González fecha: 05-03-2009 a las 08:09:16. |
|
#5
|
|||
|
|||
|
Gracias por seguir pensando en el tema
![]() Como alternativa al método que se ha propuesto he optado por captar la excepcion EAbstractError. Lo que no se es que solucion es mas eficiente: usar MethodAddress o detectar que el objeto no tiene implementado el metodo a traves de la excepcion EAbstractError. Lo que no se es si usando la excepcion me dejo algun caso por el camino, por ejemplo, que en la clase padre el metodo sea virtual y en la clase hija no se implementa porque usa el metodo virtual del padre. PD: el rendimiento de la aplicacion puede verse diezmado si se abusa del control de las excepciones? Saludos |
|
#6
|
||||
|
||||
|
¡Hola!
Cita:
Atrapar la excepción es una forma de lograrlo, pero tiene varios inconvenientes: 1. Te ves obligado a llamar al método. Es decir, sólo intentando la llamada podrás saber si el método es abstracto o no. Por lo que se reduce la capacidad de maniobra. 2. Dependiendo de las rutinas que el método llame directa o indirectamente, la excepción no será del todo segura para saber si el método es abstracto (el método puede no serlo, pero ¿qué tal si internamente llama a uno que sí?). 3. Puede verse afectado el rendimiento de la aplicación, dependiendo de qué tan frecuentemente se realicen llamadas a los métodos abstractos que se quiere controlar. En mi opinión, son más eficientes las dos primeras soluciones de las tres que propuse anteriormente. E incluso la tercera (la de la instancia dummy) podría en algunos casos resultar mejor que el manejo de la excepción. Cita:
¡Hasta luego! Al González. ![]()
__________________
Tras casi seis años de trabajar para una empresa alemana como desarrollador Delphi, se vieron forzados a dejarme ir (temas presupuestales). Así que ahora estoy abierto a escuchar nuevas ofertas. |
|
#7
|
|||
|
|||
|
Bueno, actualicé eso que veníamos hablando en el otro hilo de las VMT y actualicé el RTTIUtils.pas y lo subí al FTP (en Delphi-Win32/Recursos):
http://www.terawiki.clubdelphi.com/a.../RttiUtils.zip Bueno, además de lo que estaba, le agregué una función que salió de esta conversación. Es la siguiente: function IsOverrideMethod(AClass, Ancestor: TClass; MethodIndex: Integer ): boolean; Adentro se chequea que los argumentos sean válidos y luego Itera por la jerarquía de herencias... mmmm..... ahora que lo pienso a lo mejor está de más eso... no sé... bué... ya está, luego veremos. Ejemplo de Uso:
Se escuchan comentarios, sugerencias y derivadas ![]() |
|
#8
|
|||
|
|||
|
Hola de nuevo. Voy a intentar explicar lo que estoy haciendo.
Me he creado una clase llamada TUniverso. Esta clase es la clase base a partir de la cual heredan todas las posibles clases que necesite para mis aplicaciones. Por otro lado tenemos una jerarquia de contenedores cuya clase base es TContenedor y desciende directamente de TUniverso. TUniverso tiene una serie de operaciones : asignar, duplicar, comparar,EsMayor,... La cuestion es que todos los objetos que haga son descendientes de TUniverso, por lo que tambien se podran usar los métodos antes descritos. La gracia del asunto es que he usado RTTI en TUniverso de forma que no se tenga que implementar en las clases que te hagas las funciones tipicas de comparar dos objetos, asignar un objeto a otro,..... Todo esto funciona para las propiedades publicadas claro. Por otro lado tenemos la jerarquia contenedor. Estos contenedores guardan cosas del tipo TUniverso o descendiente. Esta jerarquia de contenedores tiene contenedores para guardar elementos del mismo tipo, tipos distintos e incluso elementos repetidos. Hay listas,colas,pilas,arboles,tablas hash,.... Tambien he implementado funciones de E/S para escribir y leer objetos desde fichero. En definitiva lo que queria hacer era una jerarquia de contenedores genericos. La unica condicion que se impone es que los objetos deben descender directa o indirectamente de TUniverso. Ahora estoy con las operaciones de E/S. La forma en que escribo el objeto en disco es igual para objetos simples o complejos. Entiendo un objeto complejo como uno que ademas de tener propiedades simples,enteras,caracteres,....tiene propiedades de tipo objeto, como los contenedores que explique antes. Dentro de las operaciones de E/S hay dos métodos abstractos (llamemosre EscribirRegistro y LeerRegistro cuya implementacion se deja para el usuario que crea una clase a partir de TUniverso. Razón de estos métodos: Entiendo que al ahora de guardar un objeto en memoria lo normal es crearse un tipo de registro que albergue las propiedades del objeto que nos interesa guardar. Los métodos del parrafo anterior hacen eso, escribe o lee el registro equivante del objeto en el fichero. Como no todas las clases de TUniverso necesitan implementar las funcionalidades de E/S puede que haya clases derivadas de TUniverso que no implementen LeerRegistro y EscribirRegistro. Existe una funcion llamada AddToFile que añade el objeto actual al fichero. Esta funcion es virtual. En TUniverso se implementa de una manera, la cual sirve para objetos simples. Pero en TContenedor cambia la implementacion al ser el objeto un contenedor. Estoy en un punto en el que estoy insertando unos objetos en un fichero. Este fichero (no lo he dicho) tiene informacion de control para poder localizar los objetos. El problema que tengo es que dentro del procedimiento en un punto debo saber si el objeto que estoy tratando ha cambiado la implementacion de AddToFile o no, ya que la informacion de control que guarde depende de ello. A parte de la solucion que consiga, la verdad es que me gustaria saber si es posible sacar este tipo de informacion de un objeto. Pues ya esta, realmente no es como me hubiera gustado explicarlo, pero espero que ahora el contexto del problema este mas claro PD: de nuevo disculpas por mi mania de responder a los mensajes por el final, ya que se puede dar el caso de que hayan dado una solucion y yo sigo engordando el hilo. Saludos y gracias por la ayuda que me estan brindando. |
|
#9
|
|||
|
|||
|
Una duda que no merece respuesta pero para las horas muertas o para cuando estas bloqueao y no te sale el codigo, da mucho de si:
en que leguaje esta hecho matrix? en VB, delphi, BASIC,.... y si esta hecho VB quiere decir que microsoft esta detras de matrix? Esto es lo que pasa cuando se esta hasta altas horas de la noche intentadando domar a la bestia de transistores, las dudas empiezan a degradarse ![]() |
|
#10
|
||||
|
||||
|
Gracias por las aclaraciones.
Pues creo que puede servirte perfectamente una función como RedefineProc2. ¿Ya lo probaste? Aunque no sé si sea la mejor manera de atacar el problema (tendría que ver una muestra de tu código para intentar idear otra forma de resolverlo). Pero de que te funcionará, funcionará. ![]() Si pudieras plasmar lo que has dicho en una jerarquía simplificada de tres o cuatro clases con unos pocos métodos y sentencias esenciales, sería estupendo.
__________________
Tras casi seis años de trabajar para una empresa alemana como desarrollador Delphi, se vieron forzados a dejarme ir (temas presupuestales). Así que ahora estoy abierto a escuchar nuevas ofertas. |
|
#11
|
|||
|
|||
|
Hola, pues gracias a las aportaciones de todos los que os habeis interesado por el tema ya se por donde van los tiros.
AL Gonzales (ahora si lo escribi bien ) no he probado el codigo, mas que nada porque prefiero primero entender bien como funciona el tema de la tabla virtual y realizar mi propio codigo ya que si no no se aprende . De todas formas si a alguien le interesa lo que estoy haciendo no tiene nada mas que pedirme el codigo. Probablemente tendra algunos errores (poco optimizado o nada) pero creo que es una buena manera de conocer un poco las RTTI, asi que si alguien lo quiere....Otra duda: el uso de las RTTI merman el rendimiento de una aplicación? la duda viene de que las funciones RTTI entiendo que tienen que navegar por la jerarquia de clases y eso debe ser desde un punto de vista computacional muy costoso? estoy en lo cierto? Y otra pregunta mas: con las RTTI he conseguido informacion sólo sobre propiades de la seccion published. Se puede ir mas lejos y poder conseguir en tiempo de ejecucion informacion sobre propiedades que esten en las otras secciones? e informacion sobre variables? por lo que he visto solo se permite para propiedades (y no variables) que esten declaradas en published, pero teniendo en cuenta la falta de documentacion sobre las RTTI a lo mejor si es posible obtener informacion de cualquier componente, sea simple o no, de un objeto. Gracias por la información. Un saludo. PD: una curiosidad, ¿cuantas horas dedicais, en vuestro tiempo libre, a delphiar, ya sea porque os estais haciendo una aplicacion, por probar caracteristicas del lenguaje o entorno, porque para ustedes programar es como para un pintor hacer un cuadro,.... |
![]() |
|
|
Temas Similares
|
||||
| Tema | Autor | Foro | Respuestas | Último mensaje |
| Saber que aplicacion tiene el foco | Omega | Varios | 3 | 13-07-2008 17:36:01 |
| Sobreescribir método Paint y saber coordenadas a refrescar | Lord Delfos | Gráficos | 3 | 05-03-2008 13:48:28 |
| saber si un field tiene el foco | salvanano | Conexión con bases de datos | 0 | 08-05-2007 16:22:48 |
| Como saber los dias que tiene un mes?? | alfredosg19 | Varios | 3 | 06-03-2005 12:56:12 |
| Saber si la Variable tiene letras | cmgenny | Varios | 1 | 11-05-2004 08:00:59 |
|