2010-07-01 20 views

Respuesta

20

Las propiedades públicas y las propiedades publicadas tienen la misma visibilidad, como usted ya indicó. Las propiedades publicadas se incluyen en RTTI, las propiedades públicas no.

+7

RTTI significa información de tipo de tiempo de ejecución o la información que el compilador de Delphi necesita en tiempo de diseño para que el inspector de objetos y otras partes del IDE de Delphi funcionen correctamente en el momento del diseño. –

+4

Para completar: Delphi 2010 también puede generar RTTI para miembros públicos, de hecho, puede generar RTTI para todos los miembros, incluidos los protegidos y privados. Pero los miembros publicados siguen siendo los "publicados" por el Inspector de objetos y utilizados por el mecanismo de transmisión automática. –

+0

¿Funciona Free Pascal como Delphi 2010? Como en, ¿genera RTTI para propiedades públicas? ¿Sería seguro no usar publicado por simplicidad? – jocull

23

El compilador genera metadatos RTTI (información de tipo de tiempo de ejecución) para miembros publicados, pero no para miembros públicos (de forma predeterminada). El principal efecto de esto es que las propiedades publicadas de un objeto aparecerán en el Inspector de Objetos en tiempo de diseño.

No sé si está escribiendo componentes, pero si lo hace, probablemente sepa que las propiedades y los eventos normalmente se publican, de modo que se pueden configurar con el Inspector de objetos.

Pública

public 
    property MyProperty: integer read FMyProperty write FMyProperty 

MyProperty se no ser visisble en el inspector de objetos.

Publicado

published 
    property MyProperty: integer read FMyProperty write FMyProperty 

MyProperty será visisble en el inspector de objetos.

+3

Si bien esto es correcto, la causa subyacente de por qué aparece en el inspector de objetos es que los metadatos RTTI están presentes para los miembros publicados. En otras palabras, lo que estás viendo es un efecto de la diferencia subyacente. Una respuesta más correcta es que los miembros publicados tienen RTTI, mientras que los miembros públicos no. –

+0

@Lasse V. Karlsen: Sí, tienes razón. Pero dado que esta es probablemente la diferencia más visible (?), Y ninguna otra respuesta lo ha señalado todavía, me abstendré de eliminar mi respuesta en este momento. –

+0

Disculpe, no me hice lo suficientemente claro :) Estoy de acuerdo, este es el efecto más observable de la diferencia. Mi punto es que debe señalar que la diferencia subyacente es RTTI, no eliminar su respuesta (aunque otras respuestas apuntan a RTTI ahora). –

4

Las propiedades publicadas exportarán información de tipo de tiempo de ejecución (RTTI).

Tener una mirada here sobre RTTI en Delphi

3

autonomía Tipo de Información (RTTI) sólo se generan para published miembros de la clase.

+0

A menos que se especifique {$ M +}/{$ TYPEINFO ON}, en este caso los miembros públicos también tendrán RTTI – mjn

+0

Si eso es cierto, @Mjustin, entonces es un cambio con respecto a versiones anteriores de Delphi. Solía ​​ser que * sin * $ M +, público y publicado eran equivalentes. Es decir, la sección publicada no generó RTTI a menos que $ M + estuviera en vigencia. –

3

En el tiempo de ejecución, las entradas en las secciones publicadas y públicas son igualmente accesibles.

La principal diferencia entre ellos es que artículos publicados de un componente aparecen en el inspector objetos en tiempo de diseño.

Esto sucede porque, para los campos en la sección publicada, RTTI se genera automáticamente.

El Inspector de objetos recoge esto y lo usa para identificar qué agregar a su lista de propiedades y eventos.

9

Como nota al margen, no es otra cosa especial con publicadas:

La visibilidad predeterminado de miembros de la clase es published, a fin de comprobar de código no seguro como:

TTopSecret = class(TObject) 
    Name: string; 
    Password: string; 

    function DecryptPassword(const AValue): string; 
    public 
    constructor Create(const AName, AEncryptedPassword: string); 
    end; 

Name, Password y DecryptPassword() son visibles 'en todo el mundo'.

3

Además de las otras respuestas:

propiedades publicadas son almacenados automáticamente por el sistema de streaming.

Por ejemplo, si usted tiene ejemplo, descendiente de una TComponent y escribirla en un TStream con WriteComponent, todo (bueno, no todos, pero esa es otra cuestión) el portal de anuncios se escriben en la corriente sin ningún tipo de codificación más.

Por supuesto, el sistema de transmisión solo puede hacerlo porque el RTTI está disponible para esas propiedades publicadas.

+0

¡Esta es probablemente la distinción más importante! RTTI es solo el "pegamento" necesario para que esto suceda. – Roddy

4

Parece que ya hay muchas buenas respuestas, señalando el Object INspector, RTTI, , etc. Estas son todas las piezas del rompecabezas.

Si quita la palabra clave publicada, todo el diseño de la herramienta Delphi RAD requerirá de alguna manera especificar qué propiedades se almacenan en un DFM, inspeccionar en el inspector de propiedades del componente y se pueden cargar en tiempo de ejecución desde un DFM cuando formulario o módulo de datos creado.

Esto, en una palabra, es para lo que se ha publicado. Es interesante para mí que los diseñadores de QT (originalmente TrollTech, más tarde parte de Nokia, que más tarde se escindió en Digia) tuvieron que emular este nivel de RTTI para su biblioteca de RAD de C++ "QT", añadiendo un equivalente "publicado" y un equivalente de "propiedad", mientras que C++ puro aún carece de esta facilidad fundamental.

Cuestiones relacionadas