C的文件是否具有面向对象的界面?

通过标准C函数fopen等使用的FILE类型是否具有面向对象的接口?

我正在寻找有推理的意见,而不是绝对的答案,因为OO的定义因你提出的问题而异。 它遇到或不符合的重要OO概念是什么?

在回答下面JustJeff的评论时,我不是在问C是否是OO语言,也不是C(容易与否)是否允许OO编程。 (这不是一个单独的问题吗?)

从学术上讲,当然实际的文件对象 。 它们具有属性,您可以对它们执行操作。 并不意味着FILE是一个 ,只是说,有一定程度的OO-ness需要考虑。

然而,尝试说stdio FILE接口符合OO的麻烦在于,stdio FILE接口并不能很好地表示文件的“对象性”。 您可以在OO方式下使用普通旧C下的FILE,但当然您会丧失Java或C ++提供的语法清晰度。

应该进一步补充一点,虽然你不能从FILE生成’inheritance’,但这进一步使它失去了OO的资格,但是你可能会认为它更像是环境(普通C)的错误,而不是文件的抽象概念 – – 对象本身。

实际上……你可能认为FILE就像是一个java界面。 在linux世界中,您可以通过open / close / read / write / ioctl调用操作几乎任何类型的I / O设备; FILEfunction只是覆盖在那些之上; 因此,在FILE中你有一个类似于抽象类的东西,它定义了’abstact i / o device’上的基本操作(open / read / etc),将它留给了各种派生类型,以便通过类型特定的方式来实现它们。行为。

当然,很难在一堆C代码中看到OO,并且很容易打破抽象,这就是为什么现在实际的OO语言如此受欢迎。

C是面向对象的语言吗?

在创建C和FILE时,OOP(面向对象编程)是否只是一个实验室概念?

回答这些问题将回答您的问题。

编辑:

进一步的想法:面向对象具体意味着几种行为,包括:

inheritance:你能从FILE派生新类吗?

多态性:您可以将派生类视为FILE吗?

封装:你能把FILE放在另一个对象里吗?

方法和属性: FILE是否具有特定于它的方法和属性? (例如myFile.Name,myFile.Size,myFile.Delete())

尽管有众所周知的C“技巧”来完成类似于这些行为的内容,但这并不是内置于FILE中,并不是最初的意图。

我的结论是FILE不是面向对象的。

如果FILE类型是“面向对象的”,那么我们可能会以某种有意义的方式从中得出它。 我从未见过这种推导的令人信服的例子。

可以说我有新的硬件抽象,有点像sockets,称为虫洞。 我可以从FILE(或套接字)派生来实现它。 不是 – 我可能不得不对OS内核中的表进行一些更改。 这不是我所说的面向对象

但这整个问题最终归结为语义。 有些人坚持认为使用跳转表的任何东西都是面向对象的,IBM总是声称他们的AS / 400盒子是面向对象的,通过和通过。

对于那些想要深入了解USENET comp.object新闻组的疯狂和愚蠢的人来说,这个话题在几年前已经非常详尽地讨论过,尽管是疯狂和愚蠢的人。 如果您想要搜索这些深度, Google网上论坛界面是一个很好的起点。

这取决于。 你如何定义“面向对象的界面”? 正如对abelenky的post的评论所示,很容易构造一个FILE是面向对象的论证。 这取决于你所说的“面向对象”。 它没有任何成员方法。 但它确实具有特定的function。

它不能从“常规”意义上得出,但它似乎确实是多态的。 在FILE指针后面,实现可以有很大不同。 它可以是文件,它可以是内存中的缓冲区,也可以是套接字或标准输出。

它被封装了吗? 好吧,它基本上是作为指针实现的。 除非您在其上调用适当的API函数,否则无法访问文件所在位置的实现细节,甚至文件名称。 这听起来像是封装在我身上。

答案基本上就是你想要的。 如果您不希望FILE面向对象,那么以FILE无法实现的方式定义“面向对象”。

C具有面向对象的前半部分。 封装,即你可以有复合类型,如FILE *或结构,但你不能inheritance它们,这是第二个(虽然不太重要)的一半

C号不是面向对象的语言。

我知道这是一个“绝对的答案”,你不想要,但我担心这是唯一的答案。 原因是C不是面向对象的,因此它的任何部分都不能具有“面向对象的接口”。

澄清:

在我看来 ,真正的面向对象涉及通过子类型多态性的方法调度。 如果一种语言缺乏这一点,它就不是面向对象的。

面向对象不是像GTK那样的“技术”。 这是一种语言function。 如果语言缺少该function,则它不是面向对象的。

如果面向对象仅仅是一种技术,那么几乎每种语言都可以被称为面向对象,并且该术语将不再具有任何实际意义。

oo有不同的定义。 我发现最有用的是以下(灵感来自Alan Kay):

  1. 对象保持状态(即对其他对象的引用)
  2. 对象接收(和处理)消息
  3. 处理消息可能会导致
    • 消息发送到对象本身或其他对象
    • 对象状态的变化

这意味着您可以在任何命令式编程语言中以面向对象的方式编程 – 甚至是汇编程序。 纯函数式语言没有状态变量,这使得oo不可能或者至少难以实现(记住:LISP 不是纯粹的!); 对于纯粹的声明性语言也应如此。

在C中,消息传递通常实现为函数调用,其指针指向将对象的状态保存为第一个参数的结构,这是文件处理api的情况。 尽管如此,C语言不能归类为oo,因为它没有对这种编程风格的语法支持。

另外,oo的其他一些定义包括基于类的inheritance(那么原型语言怎么样?)和封装 – 这在我看来并不是真正必要的 – 但是其中一些可以用C实现一些指针和转换魔法。