您的位置:首页 > 移动开发 > Objective-C

在GObject对象中添加私有属性

2011-08-26 14:40 423 查看
添加的私有变量必然要涉及到更多的glib的宏,不过这里我们还无法进行分析,只是使用而已。

我们的程序设置了私有属性,一个是年龄,一个是名字,然后在类初始化函数中安装了属性,在实例初始化函数中设置了他们的初值。

新多了一个struct _SomeObjectPrivate 结构体,多了一个表示属性的枚举类型,多了some_object_set_property/some_object_get_property函数。等等啦。

#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;
};

struct _SomeObjectPrivate {
guint age;
gchar *name;
};

enum
{
OBJECT_PROPERTY_0,
OBJECT_PROPERTY_AGE,
OBJECT_PROPERTY_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;
}
}

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;
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);
}

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);;
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 # 97
-- some_object_init # 125
some_object_set_property age: 0.
some_object_set_property name: no-name.
-- some_object_dispose # 78
-- some_object_finalize # 86
****finish GObject Demo ****


通过输出结果我们可以看到调用的过程,以及私有变量的值被打印出来了。这里我们并没有涉及到在main中访问私有属性,因为这个是应该交给方法去做的。

方法~就是在class中注册的函数。下面我们将接触到‘方法’的方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: