GObject学习教程---第六章:GObject 的子类继承

【GObject-03】用GObject来实现继承 基本使用 home.h #ifndef HOME_H #define HOME_H #include <glib-object.h> /*获取HOME_TYPE类型*/ #define HOME_TYPE (home_get_type()) /* 检查obj是否是Home类型,如果是,则将返回指向obj成员变量Home的指针 */ #define HOME_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), HOME_TYPE, 阅读详情

索引:https://blog.youkuaiyun.com/knowledgebao/article/details/84633798

本文是学习学习他人的博客的心得(具体详见“楼主见解”),如果源网站可访问的话,建议直接访问源网站:

楼主见解:

此章节和继承GObject一样,只是换一个基类而已,继承机制一样。


源博客网址:http://garfileo.is-programmer.com/categories/6934/posts

 

f:GObject 的子类继承

在文档 [1] 中,我们构造了一个 KbBibtex 类,其构造过程看似挺复杂,但实际上只需要动手尝试一下,即可明白 GObject 子类化的各项步骤的意义与作用。许多事物之所以被认为复杂,是因为大家在观望。

本文沿用文档 [1] 中的那个 KbBibtex 示例,学习如何对其进行子类化,构造新类,即面向对象程序设计方法中类的继承。

文献有很多种类

写过论文的人都知道,参考文献的形式有许多种类,例如期刊论文、技术报告、专著等,并非所有的文献格式都能表示文档 [1] 所给出的 KbBibtex 对象属性,即:

1

2

3

4

5

6

7

typedef struct _KbBibtexPrivate KbBibtexPrivate;

struct _KbBibtexPrivate {

        GString *title;

        GString *author;

        GString *publisher;

        guint   year;

};

对于期刊论文而言,也许我们期望的数据结构是:

1

2

3

4

5

6

7

8

9

10

11

typedef struct _KbBibtexPrivate KbBibtexPrivate;

struct _KbBibtexPrivate {

        GString *title;

        GString *author;

        GString *journal;

        GString *volume;

        GString *number;

        GString *pages;

        guint   year;

        GString *publisher;

};

对于技术报告,需求又要变成:

1

2

3

4

5

6

7

typedef struct _KbBibtexPrivate KbBibtexPrivate;

struct _KbBibtexPrivate {

        GString *title;

        GString *author;

        GString *institution;

        guint   year;

};

这样的变化非常之多。因此,设计一个“万能”的 KbBibtex 类,使之可以表示任何文献类型,看上去会很美好。

类的继承

因为期刊论文这种对象只比文档 [1] 中的 KbBibtex 对象多出 4 个属性,即 journal、volume、number、pages,其他属性皆与 KbBibtex 对象相同。

在程序猿的职业生涯中也许不断听到这样的警告:Don't Repeat Yourself(不要重复)!所以面向对象程序设计方法会告诉我们,既然 KbBibtex 对象已经拥有了一部分期刊论文对象所需要的属性,后者与前者都属于 KbBibtex 类(因为它们都是文献类型),那么只需设计一个期刊论文类,让它可以继承 KbBibtex 类的所以所拥有的一切,那么就可以不用 DRY 了。

那么怎么来实现?和 GObject 子类化过程相似,只需建立一个 kb-article.h 头文件,与继承相关的代码如下:

1

2

3

4

5

6

7

8

9

10

11

#include "kb-bibtex.h"

 

typedef struct _KbArticle KbArticle;

struct _KbArticle {

        KbBibtex parent;

};

 

typedef struct _KbArticleClass KbArticleClass;

struct _KbArticleClass {

        KbBibtexClass parent_class;

};

然后,再建立一个 kb-article.c 源文件,其中与继承相关的代码如下:

1

G_DEFINE_TYPE (KbArticle, kb_article, KB_TYPE_BIBTEX);

另外,KbBibtex 对象的 kb_bibtex_printf 方法也需要被 KbArticle 对象继承,这只需在 kb_article_printf 函数中调用 kb_bibtex_printf 即可实现,例如:

1

2

3

4

5

6

7

8

void

kb_article_printf (KbArticle *self)

{

        kb_bibtex_printf (&self->parent);

 

        /* 剩下代码是 KbArticle 对象的 kb_article_printf 方法的具体实现 */

        ... ...

}

当然,kb-article.h 和 kb-article.c 中剩余代码需要类似文档 [1] 中实现 KbBibtex 类那样去实现 KbArticle 类。这部分代码,我希望你能动手去尝试一下。下面,我仅给出测试 KbArticle 类的 main.c 源文件内容:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

#include "kb-article.h"

 

int

main (void)

{

        g_type_init ();

         

        KbArticle *entry = g_object_new (KB_TYPE_ARTICLE,

                                         "title", "Breaking paragraphs into lines",

                                         "author", "Knuth, D.E. and Plass, M.F.",

                                         "publisher", "Wiley Online Library",

                                         "journal", "Software: Practice and Experience",

                                         "volume", "11",

                                         "number", "11",

                                         "year", 1981,

                                         "pages", "1119-1184",

                                         NULL);

        kb_article_printf (entry);

 

        g_object_unref (entry);

        return 0;

}

测试结果表明,一切尽在掌握之中:

1

2

3

4

5

6

7

8

9

$ ./test

    Title: Breaking paragraphs into lines

   Author: Knuth, D.E. and Plass, M.F.

Publisher: Wiley Online Library

     Year: 1981

  Journal: Software: Practice and Experience

   Volume: 11

   Number: 11

    Pages: 1119-1184

继承真的很美好?

通过类的继承来实现一部分的代码复用真的是很惬意。但是,《C 专家编程》一书的作者却不这么认为,为了说明类的继承通常很难解决现实问题,他运用了一个比喻,将程序比作一本书,并将程序库比作一个图书馆。当你基于一个程序库去写你个人的程序之时,好比你在利用图书馆中的藏书去写你个人的书,显然你不可能很轻松的在那些藏书中复印一部分拼凑出一本书。

就本文开头所举的例子而言,就无法通过继承文档 [1] 所设计的 KbBibtex 类来建立技术报告类,因为技术报告对象是没有 publisher 属性的。

也许你会说,那是 KbBibtex 类设计的太烂了。嗯,我承认这一点,但是你不可能要求别人在设计程序库时候知道你想要什么,就像你不能去抱怨为什么图书馆里的藏书怎么不是为你写书而准备的一样。

基类设计的失误,对于它的所有子类是一场巨大的灾难。要避免这种灾难,还是认真考虑自己所要解决的问题吧。其实很多问题都可以不需要使用继承便可以很好的解决,还有许多问题不需要继承很多的层次也可以很好的解决。

对于本文的问题,不采用继承的实现会更好。比如我们可以这样来改造 KbBibtex 类:

  • 将 Bibtex 文献所有格式的属性都设为 KbBibtex 的类属性
  • 为 Bibtex 对象拥有一个链表或数组之类的线性表容器,或者效率更高的 Hash 表容器(GLib 库均已提供),容器的第一个单元存储 Bibtex 对象对应的文献类型,其他单元则存储文献的属性。
  • 在 kb_bibtex_set_property 与 kb_bibtex_get_property 函数中,实现 Bibtex 类属性与 Bibtex 对象属性的数据交换。

仅此而已。

如果说继承是美好的,那么平坦一些会更美好。如果你不愿意选择平坦,那么可以选择接口(Interface),这是下一篇文档的主题。

~ End ~

参考文档

[1]  温故而知新

转载时,希望不要链接文中图片,另外请保留本文原始出处:http://garfileo.is-programmer.com

Gstreamer基础之Gobject 文章目录Gobject简介 GStreamer是依附于GLib 2.0对象模型的,采用了信号与对象属性的机制,所有的GStreamer对象都采用GObject继承的方法进行扩展,是所有GStreamer对象的基类,因此有必要学习一下Gobject是怎么回事。 Gobject简介 ... 阅读详情

相关推荐

A2B音频总线在智能座舱中的应用

车载A2B链路音频是智能座舱的核心功能,涵盖车载音响、语音识别、e-Call、消噪及回声消除等应用,随着汽车智能网联化的发展,对音频的开发要求也越来越高,需要加入更先进、功能丰富的信息娱乐功能以满足消费者的用户体验。但传统的模拟并行音频信号传输方式,难以在功能增加与整车轻量化(线缆的重量及成本减少)之间取得均衡。这时候就需要A2B音频总线了。A2B音频总线用于连接车辆中的音频设备,如麦克风(MIC)、功放(AMP)、多媒体主机(Head Unit)和T-BOX等。通过一条低成本的非屏蔽双绞线UTP,进行跨距

怿星科技的博客 3934

GObject 学习笔记汇总---6

转自: garfileo.is-programmer.com/2011/3/8/inherition-of-gobject.25106.html GObject 的子类继承 在文档 [1] 中,我们构造了一个 KbBibtex 类,其构造过程看似挺复杂,但实际上只需要动手尝试一下,即可明白 GObject 子类化的各项步骤的意义与作用。许多事物之所以被认为复杂,是因为大家在观望。

吾皇的博客 822

基于STM32的智能火灾报警系统设计:多传感器融合与远程控制实现

本文详细介绍基于STM32单片机的智能火灾报警系统设计,采用多传感器融合技术(烟雾、温度、火焰检测)实现高精度火灾识别。系统集成远程控制与手机APP监控,通过加权决策算法降低误报率,提供多级响应策略,确保火灾预警的准确性与可靠性。

u5v6w7的博客 1102

函数指针、回调函数与 GObject 闭包 GObject 子类对象的析构过程 GObject 的信号机制——概览

原文地址:http://garfileo.is-programmer.com/2011/3/21/gobject-signal.25477.html Garfileo posted @ 2011年3月21日 20:16 in GObject 笔记 with tags glib GObject gsignal , 3894 阅读 手册所述,GObject 信号(Gigna

yazhouren的专栏 1529

Plot3d 网格数据格式

PLOT3D是一个计算机图形程序,旨在可视化计算流体力学的网格和解决方案。PLOT3D文件可以是ASCII, 也可是Fortran unformatted 或 C binary形式。PLOT3D文件分为网格文件(XYZ 文件), 空气动力学结果文件 (Q 文件)和通用结果文件(函数文件 + 函数名称文件)。网格文件中可加入所谓的IBlank参数。

weixin_62592231的博客 3720

玄机-Linux权限维持-后门

玄机-Linux权限维持-后门

m0_46439803的博客 764

GObject Tutorial

GObject Tutorial Ryan McDougall(2004) 目的 — 这篇文档可用于两个目的:一是作为一篇学习Glib的GObject类型系统的教程,二是用作一篇按步骤的使用GObject类型系统的入门文章。文章从如何用C语言来设计一个面向对象的类型系统开

我们这里还有鱼······ 1505

iphone查看/private/var/mobile/Containers/Data/Application/文件

xcode查看iPhone的private/var/文件夹xcode连接iPhone真机选择app下载Containers文件夹到mac电脑中查看手机中下载的文件 使用xcode真机调试的时候,文件目录都是这种/private/var/mobile/Containers/Data/Application/FAEFDF4D-5CE4-474F-9C53-C19789DB59F6/tmp/ xcode连接iPhone真机 不需要越狱,使用xcode上连接iPhone,然后选择运行的app,选择window-&g

小手琴师的博客 101万+

使用 GObject 库模拟类的数据封装形式

本文原始出处:http://garfileo.is-programmer.com 事实上,有关 GObject 库的学习与使用,GObject 库参考手册提供了一份简短且过于晦涩的指南。如果你能够理解它,那么完全可以无视这篇以及后续的几篇文章。倘若没有明白那份指南,那么建议最好能克制一下,先不要急于去做文档 [1] 中所列举那些探索,谨记 Knuth 所说的,过早优化是诸恶之源。 这篇文档主要

铁匠Smith先生的专栏 1897

Hugging Face快速入门(重点讲解模型(Transformers)和数据集部分(Datasets))

1. Hugging Face是什么,提供了哪些内容 2. Hugging Face模型的使用(Transformer类库) 3. Hugging Face数据集的使用(Datasets类库)

iioSnail的博客 8万+

Autosar CAN 网络管理标准文档

Autosar CAN 网络管理标准文档

蚂蚁小兵 925

Gobject专栏索引

索引首页:https://blog.youkuaiyun.com/knowledgebao/article/details/84776046 官网API:https://developer.gnome.org/gobject/stable/ gobject相关概念:https://blog.youkuaiyun.com/knowledgebao/article/details/82498187 第一章:GObjec...

knowledgebao的博客 7528

【原创教程】西门子1500与施耐德伺服的通讯以及调试

该函数块主要描述伺服的手动,左边的引脚Forward是指伺服手动正转,Backward是指伺服手动反转,Fast是指手动的某个方向为快速运行,TipPos手册上描述为固定值,WaitTIme是指伺服手动的相应时间,VeloSlow指伺服手动正常慢速运动的速度,VeloFast指伺服手动快速运动的速度,Acceleration是指伺服手动的加速度,Decelertion是指伺服手动的减速度。该函数块用于伺服停止,左边的引脚Execute为伺服停止执行,Deceleration含义为减速,Axis为轴。

Qinmingyue13的博客 1374

6. Gobject 学习总结

简单的来说,GObject是一个程序库,它可以帮助我们使用C语言编写面向对象的程序。   很多人被灌输了这样一种概念:要写面向对象程序,那么就需要学习一种面向对象编程语言,例如C++、Java、C# 等等,而 C 语言是用来编写结构化程序的。事实上,面向对象只是一种编程思想,不是一种编程语言。换句话说,面向对象是一种游戏规则,它不是游戏。GObject 告诉我们,使用 C 语言编写程序时,可以

吾皇的博客 4778

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

GObject 简明教程(二)

最近,我一直在深入学习 GStreamer(相关教程可以从我主页中看到)。在探索其复杂的设计逻辑时,我意识到需要深入研究 GStreamer 的源码。而因为 GStreamer 是基于 GObject 开发的,掌握 GObject 的基本概念就显得尤为重要。本文整理自,简化了细节,保留了一些关键内容,以便更好地理解。上一章GObject 简明教程(一)我们介绍了的前面五章。今天我们继续,将后面几章也进行总结和更新。

记录学习的过程 959

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

要相信 GObject 是有用并且简单的!

在 GTK+ 的众多底层库中,GObject 与 GLib 是两块基石,在它们之上矗立着 Cairo、Pango、Clutter、GDK、ATK 等支柱,还有 GtkGLExt 这棵对我而言非常重要的小支柱,没有它我便不知道该如何在 GTK+ 中直接绘制 OpenGL 三维图形。

txgc1009的专栏 1462

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

GObject 简明教程(一)

最近,我一直在深入学习 GStreamer(相关教程可以从我主页中看到)。在探索其复杂的设计逻辑时,我意识到需要深入研究 GStreamer 的源码。而因为 GStreamer 是基于 GObject 开发的,掌握 GObject 的基本概念就显得尤为重要。本文整理自,简化了细节,保留了一些关键内容,以便更好地理解。提示:以下是本篇文章正文内容,下面案例可供参考。

记录学习的过程 2297

GTK+浅谈之十五GObject面向对象的继承

GObject的对象系统是一个建立在GLib基础上的,用C语言完成的,提供了一种灵活的、可扩展的、并容易映射(到其它语言)的面向对象的C语言框架。在GLib和GTK+中使用C的语法模拟CPP的行为,实现继承。 GLib中最有特色的是它的对象系统:GObject System,它是以Gtype为基础而实现的一套单根继承的C语言的面向对象的框架。GType是GLib运行时类型认证和管理系统。GType API是GObject的基础系统,所以理解GType是理解GObject的关键。Gtype提供了

乌托邦 6173

GObject 子类私有属性的外部访问

本文原始出处:http://garfileo.is-programmer.com   之前,写了一篇 GObject 劝学的文章 [1],还有两篇有关 GObject 子类对象数据封装的文章[2,3]。 虽然,创建一个 GObject 子类对象需要一些辅助函数和宏的支持,并且它们的内幕也令人费解,但是只要将足够的信任交托给 GObject 开发者,将那些辅助函数和宏当作“语法”糖一样享用,一

铁匠Smith先生的专栏 2539

四、GObject子类的继承

1 Bibtex文献类的设计 1.1 Bibtex类头文件 /* file name: my-bibtex.h */ #ifndef KB_BIBTEX_H #define KB_BIBTEX_H #include<glib-object.h> #define MY_TYPE_BIBTEX (my_bibtex_get_type()) #define MY_BIBTEX(object) \ G_TYPE_CHECK_INSTANCE_CAST ((object), MY_TY

Creationyang的博客 317

GObject面向对象的继承的例子

1、继承GObject的对象Boy(父类是GObject) (1)头文件boy.h:     #ifndef _BOY_H_     #define _BOY_H_     #include &lt;glib-object.h&gt;     /**BOY_TYPE宏封装了boy_get_type函数,可以直接取得并替代Boy对象的ID标识;      * BOY(obj)宏是G_TYPE_CH...

evsqiezi 1328

快速上手Gobject

What is G-object? —很多人被灌输了这样一种概念:要写面向对象程序,那么就需要学习一种面向对象编程语言,例如C++、Java、C#等等,而C语言是用来编写结构化程序的。 —事实上,面向对象只是一种编程思想,不是一种编程语言。换句话说,面向对象是一种游戏规则,它不是游戏。 —Gobject,亦称Glib对象系统,是一个程序库,它可以帮助我们使用C语言编写面向对象程序;它提供了一

铁匠Smith先生的专栏 2万+

GObject学习教程---第十四章:GObject 信号机制——信号连接

索引:https://blog.youkuaiyun.com/knowledgebao/article/details/84633798 本文是学习学习他人的博客的心得(具体详见“楼主见解”),如果源网站可访问的话,建议直接访问源网站: 楼主见解: 解释g_signal_connect,不读也罢。 源博客网址:http://garfileo.is-programmer.com/categories/6...

knowledgebao的博客 2185

GObject 对象系统

目的    本文档可用于两个目的:一是作为一篇学习Glib的GObject类型系统的教程,二是用作一篇按步骤使用GObject类型系统的入门文章。本文从如何用C语言来设计一个面向对象的类型系统着手,将GObject作为假设的解决方案。这种介绍的方式可以更好的解释这个开发库为何采用这种形式来设计,以及使用它为什么需要这些步骤。入门文章被安排在教程之后,使用了一种按步骤的、实际的、简洁的组织形

gl_ding的专栏 3294

简单的GObject程序-入门

为了看看GObject的构造析构问题做的一个简单的程序,话不多说: 文件结构:glib_books.h glib_books.c glib_test1.c Makefile   //定义了一个books的类 //glib_books.h #ifndef _GLIB_BOOKS_H_ #define _GLIB_BOOKS_H_ #include #define M_TYPE_BO

天好蓝 1493

GObject 学习笔记汇总---15

转自: http://garfileo.is-programmer.com/2011/3/28/a-simple-example-for-gobject-introspection.25662.html GObject Introspection 的简单示例 这段时间以来,一直在跟 GObject 死磕。除了有点枯燥与乏味之外,也没什么不适,就是一堆繁琐但还算是直观的 C 代码罢了

吾皇的博客 1245
上一篇: GObject学习教程---第五章:温故而知新
下一篇: GObject学习教程---第七章:继承与接口
knowledgebao
博客等级 码龄15年 401粉丝 198原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值