2010-02-10 13 views
5

¿El RTTI ampliado en Delphi 2010 ofrece una forma de enumerar Class and Record Helpers definido en tiempo de ejecución?¿Encontrar todos los ayudantes de la clase en Delphi en el tiempo de ejecución usando RTTI?

Por lo que sé Delphi does not show a hint or warning cuando se define más de un ayudante de clase para una clase, la detección de ayudante de clase puede ser una rutina útil en 'control de calidad'.

p.s. por supuesto, sé que nunca debería usar componentes o bibliotecas de terceros sin el código fuente, lo que facilitaría grep a los ayudantes de la clase.

+2

No importa si más de un ayudante se define en tiempo de ejecución. Si intenta utilizar métodos introducidos por un asistente que no sea el definido más recientemente, su código ni siquiera se compilará, por lo que * no hay * tiempo de ejecución. –

+0

@Rob: cita de la página vinculada (Turbocharging Delphi 2010): "puede definir y asociar múltiples clases auxiliares con un solo tipo de clase" - ¿esto significa que si asocio varios asistentes de clase con una sola clase, el código no compilará ¿nunca más? – mjn

+1

Puede crear varios ayudantes, pero solo uno tendrá efecto a la vez. Continúe leyendo la oración que acaba de citar: "solo se aplica cero o un asistente de clase en cualquier ubicación específica en el código fuente. Se aplicará el ayudante de clase definido en el alcance más cercano. El alcance de ayudante de clase se determina de la manera Delphi normal (es decir, derecho a dejado en la cláusula de usos de la unidad) " –

Respuesta

9

Como los ayudantes de clase solo se aplican a una clase en función de qué helper está "más cercano" en el alcance, una clase simplemente no puede saber que existe un helper. Por ejemplo, puede crear un ayudante de clase en su unidad para "ayudar" a una clase de otra unidad para la que no tiene una fuente. La clase en la otra unidad no tiene idea de ningún ayudante. Si tuviera este conocimiento, tendría que volverse a compilar para tener esto en cuenta ... lo que lleva al próximo problema;

Considere esto: Puede tener una clase declarada en una unidad común que sea utilizada por muchas otras unidades en toda su aplicación. En cada una de esas unidades declaras un nuevo ayudante para esta clase común con diferentes métodos y funciones de "ayuda". Como cada unidad no sabe nada sobre las otras unidades que también declaran su propia ayuda, no hay, por diseño, ninguna manera de unir a todos los ayudantes. Ahora considere que esta unidad común ahora vive a través de un límite de paquete precompilado.

Los ayudantes de clase son pequeños seductores. Prometen fama y fortuna, pero con demasiada frecuencia hacen llover muerte y destrucción ... mucho después de que te hayas entregado a sus artimañas.

Por esta razón, su introducción en el lenguaje resolvió problemas muy específicos, es decir, la capacidad de "aparecer" para introducir la funcionalidad en un marco existente. Siempre que cumpla la regla de "solo un ayudante" y no se desvíe de esa ruta, puede salir relativamente indemne. De todos modos, necesitará tener la fortaleza intestinal combinada de Beowulf, Leonidas (de Esparta) y Frodo Baggins para navegar a través de estas aguas.

Dado que, aquí en el equipo de RAD Studio, estamos reacios a utilizar un ayudante de clase donde se puede evitar. Y cuando hacemos uso de ellos, se forma una falange apropiado antes incluso de comenzar ...

hay dragones aquí ...

+3

+1 para los dragones. :-) Bueno, deberías haber introducido una nueva visibilidad para los ayudantes de clase llamada ** Intestinal ** y tener eso reservado para el equipo de I + D y algunos Paladines que están a la vanguardia ...

+2

Ya sé, yo Siempre me he preguntado por qué se implementó de esa manera. ¿Por qué los ayudantes de clase tienen que ser tan atemorizantes que incluso el equipo Delphi les tiene miedo?¿Por qué estamos restringidos a usar solo uno en una clase en un momento dado? –

+0

Principalmente tiene que ver con las reglas de alcance del idioma. No íbamos a romper esas reglas, ya que eso habría creado un abismo aún mayor de confusión. No son de miedo, si y solo si, realmente, realmente entiendes las reglas y las trampas de las mismas. Los problemas surgen cuando usas ayudantes como parte integral de la API de tu framework. Entonces corre el riesgo real de luchar con los ayudantes en duelo. –

Cuestiones relacionadas