C';s文件是否具有面向对象的接口?

C';s文件是否具有面向对象的接口?,c,oop,C,Oop,通过标准C函数fopen等使用的文件类型是否具有面向对象的接口 我在寻找理性的观点,而不是绝对的答案,因为OO的定义因你问的人而异。它遇到或没有遇到哪些重要的OO概念 作为对JustJeff下面评论的回应,我不是问C是否是一种OO语言,也不是问C(容易或不容易)是否允许OO编程。(这不是一个单独的问题吗?否。C不是一种面向对象的语言 我知道这是一个“绝对答案”,这是你不想要的,但恐怕这是唯一的答案。原因是C不是面向对象的,所以它的任何部分都不能有“面向对象的接口” 澄清: 在我看来,真正的面向对

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

我在寻找理性的观点,而不是绝对的答案,因为OO的定义因你问的人而异。它遇到或没有遇到哪些重要的OO概念


作为对JustJeff下面评论的回应,我不是问C是否是一种OO语言,也不是问C(容易或不容易)是否允许OO编程。(这不是一个单独的问题吗?

否。C不是一种面向对象的语言

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

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

面向对象不像GTK那样是一种“技术”。这是一种语言特征。如果语言缺少这一特性,那么它就不是面向对象的


如果面向对象仅仅是一种技术,那么几乎每种语言都可以被称为面向对象,这个术语将不再有任何真正的意义。

C是面向对象语言吗

当创建C和文件时,OOP(面向对象编程)不仅仅是一个实验室概念吗

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

编辑:

进一步思考: 面向对象具体指几种行为,包括:

继承:您能从文件派生新类吗

多态性:能否将派生类视为文件

封装:能否将文件放入另一个对象中

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

尽管有一些众所周知的C“技巧”可以完成类似于这些行为的事情,但这不是内置到文件中的,也不是最初的意图


我的结论是文件不是面向对象的。

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

然而,试图说stdio文件接口符合OO的问题在于,stdio文件接口不能很好地表示文件的“对象性”。你可以使用OO方式使用普通的旧C文件,但是当然你会放弃java或C++提供的语法清晰度。 应该进一步补充的是,虽然您不能从文件生成“继承”,但这进一步取消了它作为OO的资格,但您可能会认为这与其说是文件作为对象本身的抽象概念,不如说是它的环境(纯C)的错误

事实上。。您可能会认为文件类似于java接口。在linux世界中,您可以通过open/close/read/write/ioctl调用操作几乎任何类型的I/O设备;文件功能只是覆盖在这些功能之上;因此,在文件中有一个类似于抽象类的东西,它定义了“抽象i/o设备”上的基本操作(打开/读取/etc),让各种派生类型使用特定于类型的行为来充实这些操作

诚然,在一堆C代码中很难看到OO,也很容易打破抽象,这就是为什么现在实际的OO语言如此流行的原因。

如果文件类型是“面向对象的”,那么我们可能会以某种有意义的方式从中派生出来。我从未见过这样一个推论的令人信服的例子

假设我有一个新的硬件抽象,有点像一个套接字,叫做虫洞。我可以从文件(或套接字)派生来实现它吗。不是真的-我可能需要对操作系统内核中的表进行一些更改。这不是我所说的面向对象

但这整个问题最终归结为语义学。有些人坚持认为任何使用跳转表的东西都是面向对象的,IBM一直声称他们的AS/400框是面向对象的,贯穿始终


对于那些想深入到USENET comp.object新闻组的疯狂和愚蠢的深渊的人来说,这个话题在几年前就在那里被详尽地讨论过,尽管是由疯狂和愚蠢的人讨论的。如果你想在这些深度进行拖网,界面是一个很好的起点。

视情况而定。如何定义“面向对象接口”?正如abelenky帖子的评论所示,构建一个文件是面向对象的论点是很容易的。这取决于“面向对象”的含义。它没有任何成员方法。但它确实有特定的功能

它不能从“传统”意义上衍生出来,但它确实似乎是多态的。在文件指针后面,实现可能会有很大的不同。它可能是一个文件,它可能是内存中的缓冲区,它可能是一个套接字或标准输出

它是封装的吗?实际上,它是作为指针实现的。除非调用适当的API函数,否则无法访问文件所在位置的实现细节,甚至无法访问文件名。对我来说,这听起来很简单


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

C将前半部分定义为面向对象。
封装,也就是说,你可以有像FILE*或struct这样的复合类型,但是你不能从它们继承,这是第二个(虽然不太重要)类型,有不同的oo定义。我发现最有用的是以下内容(受艾伦·凯的启发):

  • 对象h