是否FILE
通过标准的C函数中使用的类型fopen
等有一个面向对象的界面?
我在寻找与推理,而不是一个绝对的答案意见,作为OO的定义由谁你问不同而不同。 什么是符合或不符合重要的面向对象的概念?
在回答下面JustJeff的评论,我不要求C是否是一个面向对象的语言,也不管C(容易或不)允许面向对象编程。 (这不是一个单独的问题?)
是否FILE
通过标准的C函数中使用的类型fopen
等有一个面向对象的界面?
我在寻找与推理,而不是一个绝对的答案意见,作为OO的定义由谁你问不同而不同。 什么是符合或不符合重要的面向对象的概念?
在回答下面JustJeff的评论,我不要求C是否是一个面向对象的语言,也不管C(容易或不)允许面向对象编程。 (这不是一个单独的问题?)
在学术上来讲,当然实际的文件 对象 。 他们有属性,你可以对其进行操作。 这并不意味着文件是一个类 ,只是说,有去想度OO岬的。
有想说的是,标准输入输出文件界面资格作为OO麻烦,然而,就是标准输入输出文件界面并不代表文件的“对象性”非常好。 你可以使用在普通的老式C文件在OO的方式,当然你放弃通过Java或C ++提供的语法清晰。
它也许应该进一步补充说,虽然你不能从文件生成“继承”,这进一步不够格作为OO,但你可能会说,更重要的是它的环境(纯C)比的文件,作为抽象的概念,一个故障-object本身。
其实..你很可能做出FILE是像Java接口的情况下。 在Linux世界中,您可以通过开启/关闭/读/写/ ioctl调用运行几乎任何类型的I / O设备的; 该文件的功能只是涵盖那些之上; 因此,在文件中,你有这样的事情上定义了基本的操作(打开/读取/ etc)的抽象类“abstact I / O设备”,留给了不同种类的派生类型来充实那些不与特定类型行为。
诚然,这是很难看到在一堆的C代码的面向对象的,而且很容易打破了抽象,这就是为什么实际的面向对象的语言是如此更受追捧。
是C的面向对象的语言?
在OOP(面向对象编程)以外的任何一个实验室概念的更多C和文件被创建的时候?
回答这些问题将会回答你的问题。
编辑:
另外的想法:专门面向对象是指若干行为,其中包括:
传承:您可以从文件派生新类?
多态性:你可以把派生类的文件?
封装:你可以把一个文件的另一个对象里面?
方法和属性:是否一个文件中有方法和属性的特定呢? (例如myFile.Name,myFile.Size,myFile.Delete())
虽然众所周知C“招数”来完成类似的东西这些行为,这不是内置于文件中,而不是原来的意图。
我的结论是文件不是面向对象的。
如果文件类型是“面向对象”,想必大家都能从中以某种有意义的方式获得。 我从来没有见过这样的推导的一个有说服力的实例。
可以说我有新的硬件抽象,有点像一个插座,叫做虫洞。 我可以从文件(或插座)来实现它派生。 不是真的 - 我可能得做出一些改变,以在OS内核表。 这不是我所说的面向对象
但是这整个问题归结到底语义。 有些人坚持认为,使用跳转表什么是面向对象的,而IBM一直声称他们的AS / 400盒是面向对象的,通过和通过。
对于那些你希望动用疯狂和愚蠢是在Usenet新闻组comp.object的坑,这个话题被疯狂和愚蠢的人讨论了相当详尽还有几年前,虽然。 如果你想搜罗那些深处, 谷歌组接口是一个良好的开端。
这取决于。 你如何定义一个“面向对象的接口”? 由于意见abelenky的帖子显示,很容易构建一个说法,文件是面向对象的。 这取决于你所说的“面向对象”的东西。 它没有任何成员方法。 但它确实有特定于它的功能。
它不能从“传统”意义上获得,但它似乎是多态的。 文件指针背后,实现可以有很大的不同。 它可能是一个文件时,它可以是在存储器中的缓冲器中,它可能是一个或插座的标准输出。
难道是封装? 那么,它基本上是作为一个指针来实现。 还有就是该文件的位置,或文件的连名字,除非你调用它适当的API函数的实现细节的访问权限。 这听起来封装给我。
答案基本上是你希望它是什么。 如果你不希望文件是面向对象,然后定义“面向对象”的方式,文件不能满足。
C具有对象上半年导向。 封装,即你可以有复合类型,如FILE *或结构,但你不能从他们那里继承了这是第二次(虽然不太重要的)一半
号C不是一种面向对象的语言。
我知道这是一个“绝对的答案,”你不想要的,但恐怕这是唯一的答案。 其理由是C不面向对象的,所以没有它的一部分可以具有“面向对象的接口”。
在我看来 ,真正的面向对象包括通过亚型多态性方法分派。 如果语言缺乏这一点,它不是面向对象的。
面向对象是不是“技术”之类GTK。 它是一种语言功能。 如果语言缺乏的特点,它不是面向对象的。
如果面向对象仅仅是一种技术,那么几乎所有的语言可以被称为面向对象,以及任期将不再具有任何实际意义。
大约有面向对象的不同定义。 一个我觉得最有用的是以下(由艾伦·凯的启发):
这意味着你可以在任何命令式编程语言中的面向对象的编程方式 - 即使汇编。 一个纯粹的功能性语言没有状态变量,这使得OO不可能或者至少尴尬实现(记住:LISP是不是纯); 同样应该去纯粹的声明性语言。
在C中,消息中最常实现为函数的指针的结构体保持对象的状态作为第一个参数,其是用于文件处理API的情况下调用传递。 不过,C作为一种语言不能被归为面向对象,因为它不具备这种编程风格的语法支持。
此外,面向对象的一些其他定义包括像基于类的继承(所以怎么样原型的语言吗?)和封装 - 这是不是在我看来,真正重要的 - 但他们中的一些可以在C一些指针 - 铸造实现魔法。