FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#21
|
||||
|
||||
Cita:
Cita:
Sin embargo la consulta en la VMT sólo resulta necesaria cuando el método base es abstracto (podría no serlo, implementándolo con sólo Begin y End). Como habrás visto, la otra función que escribí, RedefineProc1, "no" consulta a la VMT (en realidad sí lo hace, como siempre que hacemos referencia o llamamos a un método virtual, pero en este caso es responsabilidad implícita del compilador). Incluso se me ocurre una tercera forma de hacer la comparación de punteros, que sirva con métodos abstractos y que no use el operador VMTOffset ni ninguna otra referencia explícita a la VMT. No es muy elegante, pero considero que podría ser práctica: consiste en crear una instancia "dummy" de la clase base que declara el método abstracto, para poder hacer una comparación tipo Metodo.Code <> MetodoInstanciaDummy.Code (adaptando la función RedefineProc1 que escribí antes). Gracias por anexar el código, gushynet. Le echaré un vistazo en estos días. Saludos. Al González. Última edición por Al González fecha: 08-02-2009 a las 20:55:30. |
#22
|
|||
|
|||
Una pregunta mas. Situacion : tengo varios amigos que no programan en delphi sino en c++, VB, C#,....
Cual es la manera de compartir la jerarquia de clases que estoy implementando de forma que mis amigos pudieran declarar objetos de tipo TUniverso en sus programas? podría encapsularse en una dll y que ellos usaran la dll? En el caso de que si pudiera compartir mi clase mis amigos podrían crearse clases descendientes de TUniverso? (creo que esto es imposible). Saludos. |
#23
|
||||
|
||||
¡Hola!
Saliéndome un poco del tema y sobre esto que comenté anteriormente: Cita:
http://www.clubdelphi.com/foros/showthread.php?t=63840 Última edición por Al González fecha: 05-03-2009 a las 08:09:16. |
#24
|
|||
|
|||
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 |
#25
|
||||
|
||||
¡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. |
|
|
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 |
|