C和Objective C之间的主要区别是什么?C中的抽象是否可行?

时间:2010-09-28 04:48:49

标签: objective-c c

C和Objective C之间的主要区别是什么?C中的抽象是否可行?

5 个答案:

答案 0 :(得分:8)

当然可以在C中进行抽象。如果您通过使用“磁化针和稳定的手”设置位来编写代码,则可能。

函数是抽象的单位。如果我将一副牌表示为char[52]的数组,那么我可以编写一个函数来对其进行混洗。在我写完这个功能之后,我再也不用考虑如何再次洗牌了。我可以说,shuffle(deck);

请注意,我可以在装配,十六进制编辑器或磁化针上书写。

答案 1 :(得分:8)

如果有人问你,“用 B 完成的 A 可以在C中完成吗?”答案总是“是”,因为所有程序都是C程序。请允许我举例说明。

Objective-C是C,带有一个用C语言编写的库,用于处理使抽象变得容易的消息传递。

Ruby,Python,Perl?它们都是C程序,用于解释定义如何处理其他文本文件的大型文本文件。因此,所有Perl,Python和Ruby程序都是具有疯狂大数据集的C程序。

LISP作为一个C程序开始计算大学的括号,以获得抽象数学博士学位,然后用一个加号大小的编辑器进行修改,现在分散了程序员编写C编程与编辑器内的俄罗斯方块,e-邮件和IRC。

Java是一种憎恶。用C语言编写。但是由多组人员编写,他们没有互相交谈,因而提出了几个名为Java的C程序,将相同的Java数据集处理成不同的,不兼容的结果。 Web浏览器担心“一次写入,测试 - 每个人”的差距,创建了JavaScript(在C中),以确保任何项目都不会再简单。

Yacc是一个用于创建更多C程序的C程序。一些科学家认为Yacc是一种原生生物,正如其重建自身的能力所证明的那样。其他人认为Yacc是C程序的自然结果,以5400转速旋转,直到它变得头晕并在地毯上乱成一团。

当然,C本身是用C语言编写的,用于将C源转换为汇编程序,汇编程序将汇编成可执行的机器代码。

用C编写。

答案 2 :(得分:4)

简而言之,Objective-C为C语言添加了面向对象的功能。

几乎所有常用的编程语言都可以进行抽象。所有这些抽象的真正含义是“隐藏某些内容的实现细节”。

编程就是创建抽象。当你设计一个函数时,这是一个抽象。例如,如果函数将数组的所有元素相加,那么抽象就让你想到“嘿,我正在添加这个数组的元素”而不是想“好吧,让我创建一个计数器变量,并且然后将它设置为数组中的第一个元素,然后获取该值,并将其添加到总和中,现在递增计数器并继续运行,如果我还没有到达数组的末尾“。

Barry的答案是一个稍微复杂的抽象示例,您可以在其中创建抽象数据类型。例如,struct _myADT可能是struct circle,您可能有创建圆圈,测量区域,调整大小等等的功能。实际上,您正在指向某个位置的指针在内存中包含圆的中心,半径等等,但抽象是你绕过圆圈的表示。

Objective C和C之间的区别在于C不是很擅长创建抽象数据类型。你必须经历各种麻烦才能隐藏结构内部正在发生的事情的细节,有人总是可以决定“我真的不需要你的抽象,让我伸手去拿这些东西,因为我比你更了解”。在Objective-C这样的面向对象语言中,您可以通过决定可以访问对象的哪些成员以及如何访问它们来实际强制执行抽象。

答案 3 :(得分:0)

C++ Versus Objective-C

简短的回答是,存在巨大的差异。这个链接是一个好的起点。

答案 4 :(得分:0)

是的,C中的抽象肯定是可能的(见下文),因为它几乎适用于任何编程语言。 C和Objective-C之间的区别不是关于抽象,而是关于依赖关系。 Objective-C的明确目的是解耦依赖模块,以便大型复杂系统不会对开发人员变得如此不合适。特别是,Objective-C的运行时绑定消息传递(而不是编译/链接时绑定函数调用)允许模块紧密耦合。调用模块只需要知道名称,而不是要调用它的方法的二进制表示。因此,模块可以在运行时单独更新,替换甚至修改,而不会破坏系统中的所有依赖项。

为了完整起见,在C中创建封装和抽象的经典方法是“abstract data type”模式。在应用此模式时,C的声明与定义拆分允许您封装和抽象数据类型的实现。

例如,在公共标题中

// MyADT.h
typedef struct _myADT *myADT;

myADT myadt_create();
void myadt_perform(myADT adt);
void myadt_free(myADT);

客户端可以使用API​​而无需了解我的数据类型的实现。结构和函数的定义在一个单独的(可能是私有的)模块中:

// MyADT.c

typedef struct _myADT {
 ...
};

void myadt_create()
{
   struct _myADT adt = malloc(sizeof(struct _myADT));
   ...
   return adt;
}

//etc...