我是靠谱客的博主 坦率毛巾,最近开发中收集的这篇文章主要介绍kali 改为gnome_为GNOME 2准备,第2部分,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

kali 改为gnome

用C语言进行OOP编程?

在本文中,我们将研究Glib对象系统,也称为“ GObject”,直到最近它还是GTK +的一部分。 但是在研究Glib 2.0中的新对象系统之前,我们需要解决一个更基本的问题-“对象系统”到底是什么,为什么存在? 毕竟,C是否不是面向对象的语言? 可以用C编写面向对象的程序,还是必须使用C ++?

答案是,它是在C语言编写的面向对象的程序。但是,由于对象的概念是不是C语言规范的一部分,外部库需要提供这种支持。 在本文中,我们使用术语“对象系统”来描述提供OOP编程所需基础的库,而Glib是此类库的示例。 Glib提供了类,继承,引用计数,信号,接口和对象属性的C实现。 通过使用Glib,C程序员可以轻松编写面向对象的程序。

因此,有可能在C.写面向对象的程序。但是,你可能会想知道为什么GTK +开发商没有先走一步,使用C ++来代替。 在没有涵盖所有可能的解释的情况下,这里有一些理由使拥有C语言的对象系统有意义。其中一个原因是,有许多开发人员只喜欢C而不是C ++。 在其他情况下,由于项目或平台的限制,可能无法选择使用C ++编译器。 无论出于何种原因,拥有用于C的对象系统都会为更多潜在的开发人员打开OOP编程(尤其是GNOME编程),对此我们深表感谢。

C ++包装器

话虽如此,所有那些C ++狂热者都不必担心-您也可以用C ++编写GNOME程序。 由于C ++是C语言的超集,因此您可以轻松地将C样式的Glib / GTK +代码与现有的C ++项目结合在一起。 另外,您可以改用Glib / GTK + C ++包装器。 Glib / GTK + C ++包装器将允许您使用本机C ++类和对象与Glib对象进行交互。

看GObject

好的,现在您知道什么是对象系统以及它的用途。 现在,我们就来看看该油嘴对象系统并探究一些基本的GObject编程概念。 直到最近,GObject系统还是在GTK + 1.2.x库中实现的。 现在,随着即将发布的GTK + 2,对象系统已经向下移动了一层到新的Glib 2库。 由于此举,Glib对象系统现在完全独立于与GUI相关的陷阱。 对于那些希望在非基于GT​​K +的程序(例如基于控制台的应用程序和工具)中使用类和对象的人来说,这是个好消息。

现在,让我们看一下与C ++和Java语言的对象系统相比,Glib对象系统(也称为“ GObject”)的外观。 首先,让我们进行语法比较。 在C ++中,您可以通过对象指针调用方法,如下所示:

object->function(arg_a, arg_b);

使用C ++对象引用,您可以输入:

object.function (arg_a, arg_b);

Java语言仅具有引用,而没有指针。 Java方法调用语法与C ++引用的对象方法调用相同:

object.function (arg_a, arg_b);

相反,GObject使用标准的C函数调用语法。 对象指针作为第一个参数传递给函数。 还要注意,函数名称以类名称为前缀,以防止名称空间冲突:

classname_function (object, arg_a, arg_b);

您可能想知道调用GObject方法与调用简单C函数有何不同。 好吧,从C编程语言本身的角度来看,没有区别。 就您的C编译器而言,它只是调用一个函数,而该函数的第一个参数恰好是指向标准C结构的指针。

因此,您的C编译器甚至都不知道我们正在编写一个面向对象的程序。 但是,不要让这个事实让您误以为GObject OOP编程只是老式的C编程的一大堆技术术语。 GObject在幕后确实做了很多工作,允许您创建现有类的子类,类的接口 (我们将在本文后面讨论)以及更多内容。 然而,所有这些OOP功能都设计为与标准C编程结构完全兼容。

这是有关GObject方法调用的另一件重要的事情。 当传递对象的一类功能(当你调用一个方法),你需要把对象相匹配的功能,您所呼叫的预期类型。 例如,如果您有一个GtkButton对象想要传递给带有GtkWidget参数的函数,则应编写:

gtk_widget_show (GTK_WIDGET (button));

GObject接口

除了对GObject的许多改进之外,Glib 2还引入了一种称为“接口”的OOP概念。 要了解什么是接口,我们来看一个示例。

假设我们要为应用程序创建Pegasus对象。 由于飞马是神话中的有翼马,因此自然而然的面向对象操作是创建一个新的飞马类,以马类为其父级。 然后,我们可以在新类中添加必要的代码以支持“ wings”。 在这种情况下,将Pegasus创建为Horse的子类很有意义,因为它表达了两个类之间的关系 。

但是,假设我们有各种各样不相关的类,例如Horse,Car和House,并且我们希望所有这些人都可以讲话 。 这种新能力与他们彼此之间的关系无关-实际上,这三个类别对我们而言没有任何关联。 但是我们希望他们所有人都支持与谈话相关的新能力。 我们会做什么?

接口提供了针对此问题的解决方案,使我们能够为不同的类添加通用功能。 因此,回到上面的示例,我们可以简单地为Horse,Car和House类编写一个“ Talk”界面。 突然,我们三个不相关的类“启用了对话”,并且能够与我们创建的新的与对话相关的功能一起使用。 这些新的与语音相关的功能通过使用“对话”界面本身,可以与我们的对象愉快地交互。 因此,由于有了接口,我们三个不相关的类现在可以使用相同的语言。

在Glib中,您可以为一个类创建任意数量的接口。 因此,如果我们为House类创建一个Talk接口,则可以如下定义一个say()函数:

void say (Talk *mytalk, const char *myphrase);

然后,我们可以调用say()函数,将myhouse变量转换为“ Talk”接口:

say (TALK(myhouse), "hello there!");

更向下到大地,接口真实的例子可以在GTK + 2的GtkEditable接口发现(参见相关信息中的链接)。 文本小部件和条目小部件均实现此接口。

GObject信号

通常,事件驱动的GUI程序由一个主循环组成。 在此循环中,程序不断等待从X服务器发送新消息。 这些消息称为事件,由程序解释,并允许程序响应用户选择菜单项,单击按钮等。

信号与事件很像,只是它们将对象彼此连接。 它们允许对象自动“响应”另一个对象的状态变化,而无需显式的事件循环。 一个对象的信号只需要连接到另一对象的方法即可。 然后,当第一个对象“发出”信号(由于状态的内部变化)时,第二个对象“捕捉”此变化并做出适当的React。 不需要事件循环,因为信号是使用回调实现的-发出信号只会导致调用C函数。 信号是将程序中的对象捆绑在一起的高效灵活的粘合剂。

实际上,如果您看一下前面的GNOMEnclature列,您会发现我们有很多示例代码行,如下所示:

g_signal_connect (G_OBJECT (window), "destroy", gtk_main_quit, NULL);

在上面的代码片段中,我们将主窗口对象的"destroy"信号连接到gtk_main_quit()函数。 感谢g_signal_connect() ,当我们的窗口发出"destroy"信号时(关闭窗口时),我们的程序将自动退出。 如果您过去曾经做过任何事件驱动的编程,那么我认为您会发现信号是从设置显式事件处理循环的常规实践中得到的令人耳目一新的变化。

因此,我们已经看到了如何将信号连接到标准C函数。 但是,我们如何将同一信号连接到特定对象的方法呢? 简单-只需使用以下模板:

g_signal_connect (G_OBJECT (window), "destroy", classname_function, object);

只需将classname_function替换为要调用的方法,并将object替换为该方法应在其上操作的对象指针。 要了解有关信号的更多信息,请查看本文的“ 相关主题”部分,以获得一些良好的链接。

但是,请注意,Glib和GTK + 2.0对信号区域进行了一些更改。 尽管基本概念没有改变,但信号系统已从GTK + 2.0移至Glib。 这具有方便的副作用,使得可以在非GUI应用程序中使用信号。 如果要编写新的GNOME 2.0代码,则应使用Glib的新GSignal类。 GTK + 2.0信号仍然存在,只是由一个“包装器”组成,该包装器在后台使用了Glib的GSignal。

尽管进行了所有更改,但Glib信号(以g_signal_为前缀)通常与它们的GTK +对应物(以gtk_signal_为前缀)非常相似。 但是,如果您已经创建或正在计划创建自己的定制信号,你应该阅读GObject的GSignal参考文档(参见相关主题 )赶上了一些可能适用于您的更改。

结论

现在我们已经了解了GObject基础知识,您应该已经具备了必要的基础概念,可以开始GNOME编程生涯。 在我们继续为GNOME 2平台进行准备的过程中,我将在下一个“ GNOMEnclature”专栏中看到您。 回头见!


翻译自: https://www.ibm.com/developerworks/opensource/library/l-gnome2/index.html

kali 改为gnome

最后

以上就是坦率毛巾为你收集整理的kali 改为gnome_为GNOME 2准备,第2部分的全部内容,希望文章能够帮你解决kali 改为gnome_为GNOME 2准备,第2部分所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(62)

评论列表共有 0 条评论

立即
投稿
返回
顶部