¿Cuál es la diferencia entre los miembros de la clase pública y publicada en Delphi?
oop rtti (8)
¿Podría alguien explicarme cuál es la diferencia entre los miembros de la clase pública y publicada en Delphi?
Traté de ver la ayuda de Delphi y entiendo que estos miembros tienen la misma visibilidad, pero no entiendo muy bien cómo difieren y cuándo debo usar miembros publicados en lugar de públicos.
Muchas gracias.
Además de las otras respuestas:
Las propiedades publicadas se almacenan automáticamente por el sistema de transmisión.
Por ejemplo, si tiene una instancia descendiente de TComponent y la escribe en una TStream con WriteComponent, todas (bueno, no todas, pero esa es otra pregunta) las propiedades publicadas se escriben en la transmisión sin ninguna codificación adicional.
Por supuesto, el sistema de transmisión solo puede hacerlo porque el RTTI está disponible para esas propiedades publicadas.
Como nota al margen, hay otra cosa especial con publicada:
La visibilidad predeterminada de los miembros de la clase está published
, por lo que debe verificar si hay algún código inseguro 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''.
El compilador genera metadatos de RTTI (información de tipo de tiempo de ejecución) para los miembros publicados, pero no para los 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úblico
public
property MyProperty: integer read FMyProperty write FMyProperty
MyProperty
no se podrá ver en el Inspector de Objetos.
Publicado
published
property MyProperty: integer read FMyProperty write FMyProperty
MyProperty
será visible en el Inspector de Objetos.
Las informaciones de tipo de tiempo de ejecución (RTTI) solo se generan para miembros de clase published
.
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.
Las propiedades publicadas exportarán información de tipo de tiempo de ejecución (RTTI).
Eche un vistazo here sobre RTTI en Delphi
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 puede volver a cargar en tiempo de ejecución desde un DFM cuando el formulario o el módulo de datos es 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.
En tiempo de ejecución , las entradas en las secciones publicadas y públicas son igualmente accesibles .
La principal diferencia entre ellos es que los elementos publicados de un componente aparecen en el Inspector de Objetos en el momento del diseño.
Esto sucede porque, para los campos en la sección publicada, RTTI se genera automáticamente.
El Inspector de Objetos toma esto y lo usa para identificar qué agregar a su lista de propiedades y eventos.