GObject
GLib Object System, o GObject, es una biblioteca de software libre bajo la licencia LGPL que provee un sistema de objetos portátil y una interoperabilidad multilenguaje transparente. GObject está diseñado para su utilización directa en programas C y a través de bindings, a otros lenguajes.
GObject | ||
---|---|---|
Parte de GLib | ||
Una pieza típica del código de inicialización de la clase GObject. El ejemplo muestra una propiedad file-size siendo añadida a alguna clase. | ||
Información general | ||
Tipo de programa | Biblioteca de desarrollo | |
Desarrollador | Proyecto GNOME | |
Lanzamiento inicial | 11 de marzo de 2002 | |
Licencia | LGPLv2.1+ | |
Estado actual | Activo | |
Información técnica | ||
Programado en | C | |
Plataformas admitidas | Multiplataforma | |
Versiones | ||
Última versión estable | 2.75.1 (info) ( 21 de diciembre de 2022 (1 año, 10 meses y 15 días)) | |
Enlaces | ||
Historia
editarDependiendo sólo de GLib y libc, GObject es la piedra angular de GNOME y es utilizada en todo GTK+, Pango, ATK, y la mayoría de aplicaciones y bibliotecas de alto nivel de GNOME. Antes de GTK+ 2.0, el código GObject era parte del código base de GTK+. (El nombre de "GObject" todavía no estaba en uso; el nombre común de la clase base fue llamado GtkObject
.)
La liberación de GTK+ 2.0 tenía extraído el sistema de objetos en una biblioteca separada debido a su utilidad general. En el proceso, la mayoría de GUI no específica de partes de la clase GtkObject
se trasladó hasta GObject
, la nueva clase base común. Habiendo existido como una biblioteca separada desde el 11 de marzo de 2002 (la fecha de lanzamiento de GTK+ 2.0), la biblioteca GObject es ahora utilizada por muchos programas sin GUI como la línea de comandos y las aplicaciones de servidor.
Relación con GLib
editarAunque GObject tiene su propio conjunto separado de documentación[1] y está normalmente compilado en su propio archivo de biblioteca compartida, el código fuente de GObject reside en el árbol de código fuente GLib y se distribuye junto con GLib. Por esta razón, GObject utiliza los números de versión de GLib y suele ser empaquetado junto con GLib (por ejemplo, Debian pone GObject en su familia de paquetes libglib2.0
).
El sistema de tipos
editarEn el nivel más básico del framework de GObject radica un tipo de dato genérico y dinámico llamado GType. El sistema GType mantiene una descripción en tiempo de ejecución de todos los objetos que permiten encolar código para facilitar múltiples bindings de lenguajes. El sistema de tipos puede manejar cualquier estructura de clase de herencia múltiple, además de tipos sin clase como punteros opacos, cadenas, y varios tamaños de números de enteros y punto flotante.
El sistema de tipo sabe cómo copiar, asignar y destruir valores pertenecientes a cualquiera de los tipos registrados. Esto es trivial para los tipos como enteros, pero muchos objetos complejos son contados por referencia, mientras que algunos son complejos pero no contados por referencia. Cuando el tipo de sistema "copia" un objeto de referencia contada, normalmente sólo aumentará su referencia contada, mientras que cuando se copia uno complejo, no un objeto de referencia contada (como una cadena), se suele crear una copia actual por asignación de memoria.
Esta funcionalidad básica se utiliza para implementar GValue
, un tipo de contenedor genérico que puede contener valores de cualquier tipo conocido por el sistema de tipo. Estos contenedores son particularmente útiles cuando interactúan dinámicamente con entornos de lenguajes tipados en los que todos los valores nativos residen en contenedores de tipos etiquetados.
Tipos fundamentales
editarTipos que no tienen ninguna clase asociada se denominan no claseados. Estos tipos, junto con todos los tipos que corresponden a alguna forma de la clase raíz, son conocidos como tipos fundamentales: los tipos a partir de la cual todos los otros tipos se derivan. Estos conforman un conjunto relativamente cerrado, pero aunque el usuario medio no se espera crear sus propios tipos fundamentales, la posibilidad existe y ha sido explotada para crear jerarquías de clase personalizadas - por ejemplo, las jerarquías de clase no basadas en la clase GObject
.
A partir de GLib 2.9.2 [1], los tipos no claseados fundamentales integrados son
- un tipo vacío, correspondiente al
void
de C (G_TYPE_NONE
); - tipos correspondientes a los tipos con signo y sin signo de C
char
,int
,long
y enteros de 64-bit (G_TYPE_CHAR
,G_TYPE_UCHAR
,G_TYPE_INT
,G_TYPE_UINT
,G_TYPE_LONG
,G_TYPE_ULONG
,G_TYPE_INT64
yG_TYPE_UINT64
); - un tipo booleano (
G_TYPE_BOOLEAN
); - un tipo enumerado y un tipo "flags”, ambos corresponientes al tipo
enum
de C, pero difiriendo en que este último es solo usado para campos de bit (G_TYPE_ENUM
yG_TYPE_FLAGS
); - tipos para simple y doble precisión IEEE punto flotante, correspondiente al
float
ydouble
de C (G_TYPE_FLOAT
yG_TYPE_DOUBLE
); - un tipo cadena, correspondiente al
char *
de C (G_TYPE_STRING
); - un tipo de puntero opaco, correspondiente al
void *
de C (G_TYPE_POINTER
).
Los tipos claseados fundamentales integrados son:
- un tipo de clase base para instancias de
GObject
, la raíz de la clase estándar de árbol de herencia (G_TYPE_OBJECT
) - un tipo de interfaz base, análogo a tipo de clase base pero representando la raíz de la interfaz estándar del árbol de herencia (
G_TYPE_INTERFACE
) - un tipo para la estructura boxed, que es usada para envolver valores simples de objetos o objetos ajenos a las "boxes" de referencia contada (
G_TYPE_BOXED
) - un tipo para "especificaciones de parámetros de objetos", que son usados en GObject para describir metadatos para propiedades de objetos (
G_TYPE_PARAM
).
Los tipos que puede ser instanciados automáticamente por el sistema de tipos son llamados instanciables. Una característica importante de esos tipos es que el primer byte de cualquier instancia siempre contiene un puntero a la estructura de clase (una forma de tabla virtual) asociada al tipo de la instancia. Por esta razón, cualquier tipo instanciable debe ser claseado. Contrapositivamente, cualquier tipo no claseado (como integer o string') debe ser no instanciable. Por otro lado, la mayoría de los tipos claseados son instanciables, pero algunos, como los tipos de interfaces, no lo son.