Inicializace třídy/instance
- Vývojářská příručka ke zpřístupnění GNOME
- Co je to zpřístupnění
- Příklady, které používají API zpřístupnění
- Implementace objektu ATK
Budete muset vytvořit inicializátor třídy pro objekt GObject, pokud vaše implementace AtkObject buď:
-
Znovu definuje kterákoliv volání funkcí definovaná v rodiči objektu. To je typicky nutné, když některý objekt potřebuje implementovat funkci, jako je atk_object_get_n_accessible_children(). To je nutné, když má objekt potomka, ale ten není reprezentován widgetem.
Například, když implementace ATK protřebuje přepsat funkci get_name() v AtkObject, vypadala by inicializace třídy nějak takto:
Příklad 1-8 Inicializace třídy, která přepisuje rodičovskou funkci get_name()myatkimp_mytype_class_init (GailLabelClass *klass) { AtkObjectClass *class = ATK_OBJECT_CLASS (klass); class->get_name = myatkimp_mytype_get_name; }
-
Vyžaduje funkci parent->init, parent->notify_gtk nebo parent->finalize. Tento příklad definuje všechny tři:
Příklad 1-9 Inicializátor třídy, který definuje své vlastní funkce init(), notify_gtk() a finalize()static ParentObjectType *parent_class = NULL; myatkimp_mytype_class_init (GailLabelClass *klass) { ParentObjectType *parent_class = (ParentObjectType*)klass; /* * Caching the parent_class is necessary if the init, * notify_gtk, or finalize functions are set up. */ parent_class = g_type_class_ref (MYATKIMP_TYPE_PARENT); parent_class->init = myatkimp_mytype_widget_init; parent_class->notify_gtk = myatkimp_mytype_real_notify_gtk; parent_class->finalize = myatkimp_mytype_finalize; }
-
parent->init
Funkce parent->init() může být nutná, když implementace ATK potřebuje udělat něco z následujícího:
- Ukládat do mezipaměti data získaná z widgetu GTK v pozadí.
- Naslouchat signálům z widgetu GTK v pozadí.
Zde je příklad obojího:
Příklad 1-10 Vlastní funkce init()void gail_tree_view_widget_init (MyatkimpMytype *mytype, GtkWidget *gtk_widget) { /* Make sure to call the parent's init function */ parent_class->init (widget, gtk_widget); /* Cache a value in the ATK implementation */ mytype->cached_value = gtk_widget_function_call(); /* Listen to a signal */ gtk_signal_connect (GTK_OBJECT (gtk_widget), "signal-type", GTK_SIGNAL_FUNC (_myatkimp_mytype_signal_type), NULL); }
Když by byl v tomto příkladu zadaný signál signal-type vygenerován z gtk_widget v pozadí, byla by pak zavolána funkce _myatkimp_mytype_signal_type().
-
parent->notify_gtk
Když implementace ATK potřebuje naslouchat upozornění na nějakou vlastnost u objektu GTK v pozadí, může být nutná funkce parent->notify_gtk(). Například:
Příklad 1-11 Vlastní funkce notify_gtk()void myatkimp_mytype_real_notify_gtk (GObject *obj, GParamSpec *pspec) { GtkWidget *widget = GTK_WIDGET (obj); AtkObject* atk_obj = gtk_widget_get_accessible (widget); if (strcmp (pspec->name, "property-of-interest") == 0) { /* Handle the property change. */ } else { parent_class->notify_gtk (obj, pspec); } }
-
parent->finalize
Když je potřeba uvolnit některá data při zničení instance GObject, pak je potřeba funkce finalize() k uvolnění paměti: Například:
Příklad 1-12 Vlastní funkce finalize()void myatkimp_mytype_finalize (GObject *object) { MyAtkimpMyType *my_type = MYATKIMP_MYTYPE (object); g_object_unref (my_type->cached_value); G_OBJECT_CLASS (parent_class)->finalize (object); }
-