用简单的方法来访问GObject对象的私有属性
2011-08-26 15:23
501 查看
这里只用到了最简单的方法,给我的感觉就是使用g_object_get/set函数来完成对已经安装的属性的存取工作。
目前我们还没有涉及到‘信号’这个NB的东西,连interface'接口'是什么,我也还没看到。
不过目前这点可怜的知识,能够对看懂gdk的源码产生一定的帮助了。
至少那些.h中的茫茫多的枚举和结构体的存在理由已经被我们找到了。
输出结果:
虽然我们的技巧还很烂,不过能够交互了不是么,O(∩_∩)O哈哈哈~
目前我们还没有涉及到‘信号’这个NB的东西,连interface'接口'是什么,我也还没看到。
不过目前这点可怜的知识,能够对看懂gdk的源码产生一定的帮助了。
至少那些.h中的茫茫多的枚举和结构体的存在理由已经被我们找到了。
#include<glib-object.h> #define SOME_OBJECT_TYPE (some_object_get_type()) #define SOME_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), SOME_OBJECT_TYPE, SomeObject)) #define SOME_IS_OBJECT(obj) (GTYPE_CHECK_TYPE((obj), SOME_OBJECT_TYPE)) #define SOME_OBJECT_CLASS(c) (G_TYPE_CHECK_CLASS_CAST((c), SOME_OBJECT_TYPE,SomeObjectClass)) #define SOME_IS_OBJECT_CLASS(c) (G_TYPE_CHECK_CLASS_TYPE((c), SOME_OBJECT_TYPE)) #define SOME_OBJECT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), SOME_OBJECT_TYPE, SomeObjectClass)) #define SOME_OBJECT_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), SOME_OBJECT_TYPE, SomeObjectPrivate)) typedef struct _SomeObject SomeObject; typedef struct _SomeObjectClass SomeObjectClass; typedef struct _SomeObjectPrivate SomeObjectPrivate; struct _SomeObject { GObject parent_obj; SomeObjectPrivate *priv; }; struct _SomeObjectClass { GObjectClass parent_class; void (*born)(void); // 出生 void (*grow)(SomeObject *self); // 成长 }; struct _SomeObjectPrivate { guint age; gchar *name; }; enum { OBJECT_PROPERTY_0, OBJECT_PROPERTY_AGE, OBJECT_PROPERTY_NAME, OBJECT_PROPERTY_BORN, OBJECT_PROPERTY_GROW }; void some_object_grow(SomeObject *self); void some_object_give_name(SomeObject *self, gchar *name); G_DEFINE_TYPE (SomeObject, some_object, G_TYPE_OBJECT) void some_object_set_property(GObject *object, guint property_id, const GValue *value, GParamSpec *pspec) { SomeObject *self = SOME_OBJECT(object); switch(property_id) { case OBJECT_PROPERTY_AGE: self->priv->age = g_value_get_uint(value); g_print("%s age: %d.\n",__func__, self->priv->age); break; case OBJECT_PROPERTY_NAME: g_free(self->priv->name); self->priv->name = g_value_dup_string(value); g_print("%s name: %s.\n", __func__, self->priv->name); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec); break; } } void some_object_get_property(GObject *object, guint property_id, GValue *value, GParamSpec *pspec) { SomeObject *self = SOME_OBJECT(object); switch (property_id) { case OBJECT_PROPERTY_AGE: g_value_set_uint(value, self->priv->age); break; case OBJECT_PROPERTY_NAME: g_value_set_string(value, self->priv->name); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec); break; } } static void born(void) { g_print("a object was born.\n"); } static void grow(SomeObject *self) { guint age =0; g_object_get(G_OBJECT(self), "property-age", &age, NULL); age += 1; g_object_set(G_OBJECT(self), "property-age", age, NULL); } void some_object_dispose(GObject *gobject) { SomeObject *slef = SOME_OBJECT(gobject); g_print("-- %s # %i\n",__func__, __LINE__); G_OBJECT_CLASS(some_object_parent_class)->dispose(gobject); } void some_object_finalize(GObject *gobject) { SomeObject *self = SOME_OBJECT(gobject); g_free(self->priv->name); g_print("-- %s # %i\n",__func__, __LINE__); G_OBJECT_CLASS(some_object_parent_class)->finalize(gobject); } static void some_object_class_init(SomeObjectClass* g_class) { g_type_class_add_private(g_class, sizeof(SomeObjectPrivate)); GObjectClass *this_class = G_OBJECT_CLASS(g_class); GParamSpec *spec; g_print("-- %s # %i\n",__func__, __LINE__); this_class->dispose = &some_object_dispose; this_class->finalize = &some_object_finalize; this_class->set_property = &some_object_set_property; this_class->get_property = &some_object_get_property; spec = g_param_spec_uint("property-age", "the age", "Set/Get age", 0, 150, 0, G_PARAM_READWRITE); g_object_class_install_property(this_class, OBJECT_PROPERTY_AGE, spec); spec = g_param_spec_string("property-name", "the name", "Set/Get name", "no-name-set", G_PARAM_READWRITE); g_object_class_install_property(this_class, OBJECT_PROPERTY_NAME, spec); } void some_object_init(SomeObject *self) { SomeObjectPrivate *priv; born(); self->priv = priv = SOME_OBJECT_GET_PRIVATE(self); priv->age = 0; priv->name = g_strdup("no-name"); g_print("-- %s # %i\n",__func__, __LINE__); g_object_set(G_OBJECT(self),"property-age",0,"property-name","no-name",NULL); } void some_object_grow(SomeObject *self) { grow(self); guint age = 0; g_object_get(G_OBJECT(self),"property-age", &age, NULL); g_print("%s I'm %d years old.\n",__func__, age); } void some_object_give_name(SomeObject *self, gchar *name) { g_object_set(G_OBJECT(self), "property-name", name, NULL); g_print("%s hi, my name is %s.\n",__func__, name); } int main() { g_print("****init the type system****\n"); g_type_init(); g_print("****init type system OK ****\n"); SomeObject *testobj = g_object_new(SOME_OBJECT_TYPE, NULL);; some_object_give_name(testobj, "Tom"); some_object_grow(testobj); some_object_grow(testobj); some_object_grow(testobj); g_object_unref(testobj); g_print("****finish GObject Demo ****\n"); return 0; }Makefile:
all: gcc `pkg-config --cflags --libs gobject-2.0` someobject.c -o test
输出结果:
****init the type system**** ****init type system OK **** -- some_object_class_init # 117 a object was born. -- some_object_init # 146 some_object_set_property age: 0. some_object_set_property name: no-name. some_object_set_property name: Tom. some_object_give_name hi, my name is Tom. some_object_set_property age: 1. some_object_grow I'm 1 years old. some_object_set_property age: 2. some_object_grow I'm 2 years old. some_object_set_property age: 3. some_object_grow I'm 3 years old. -- some_object_dispose # 98 -- some_object_finalize # 106 ****finish GObject Demo ****
虽然我们的技巧还很烂,不过能够交互了不是么,O(∩_∩)O哈哈哈~
相关文章推荐
- PHP实现在对象之外访问其私有属性private及保护属性protected的方法
- python对象:访问私有属性和私有方法
- python直接访问私有属性的简单方法
- python直接访问私有属性的简单方法
- JavaSE第六十四讲:使用反射机制调用对象的私有方法、访问对象的私有成员变量
- GObject 子类对象的私有属性模拟
- 在GObject对象中添加私有属性
- js访问xml之 各种对象的属性和方法
- 访问C++类对象中私有成员变量的方法
- $this关键字是用来访问当前对象中的对象属性和对象方法的系统变量
- 浅析对象访问属性的"."和"[]"方法区别
- js访问xml之节点对象属性和方法【1】
- 为什么一个对象调用的类方法可以访问该类其他对象的私有成员
- 简单理解Python中的类对象、实例对象、属性、方法
- Python访问类的私有属性和私有方法的正确姿势
- PHP面向对象----(私有属性的访问方法)
- Java记录 -88- 利用反射机制调用对象的私有方法和属性
- TypeError: Error #1009: 无法访问空对象引用的属性或方法。(解决)
- 简单的对象属性值对比方法
- JavaScript中的私有函数;Javascript构造函数的私有方法中访问其属性和公有方法