通过标准C函数FILE
等使用的fopen
类型是否具有面向对象的接口?
我正在寻找有推理的意见,而不是绝对的答案,因为OO的定义因你提出的问题而异。它遇到或不符合的重要OO概念是什么?
回应JustJeff在下面的评论,我不是问C是否是OO语言,也不是C(容易与否)是否允许OO编程。 (这不是一个单独的问题吗?)
答案 0 :(得分:3)
C是面向对象的语言吗?
当创建C和FILE时,OOP(面向对象编程)是否只是一个实验室概念?
回答这些问题将回答您的问题。
修改强>
进一步的想法: 面向对象具体指的是几种行为,包括:
继承:您可以从FILE派生新类吗?
多态:您可以将派生类视为FILE吗?
封装:你能把FILE放在另一个对象里吗?
方法&属性: FILE是否具有特定于它的方法和属性? (例如。 myFile.Name,myFile.Size,myFile.Delete())
虽然有众所周知的C“技巧”来完成类似于这些行为的内容,但这并不是内置于FILE中,并不是最初的意图。
我得出结论,FILE不是面向对象的。
答案 1 :(得分:3)
如果FILE类型是“面向对象的”,那么我们可能会以某种有意义的方式从中获取它。我从来没有见过这种推导的令人信服的例子。
假设我有新的硬件抽象,有点像套接字,称为虫洞。我可以从FILE(或套接字)派生来实现它。不是 - 我可能不得不对OS内核中的表进行一些更改。这不是我所谓的面向对象
但是这整个问题最终归结为语义。有些人坚持认为任何使用跳转表的东西都是面向对象的,IBM总是声称他们的AS / 400盒子是面向对象的,通过&通过。
对于那些想要深入了解USENET comp.object新闻组的疯狂和愚蠢的人来说,这个话题在几年前就已经非常详尽地讨论了,尽管是疯狂和愚蠢的人。如果你想追踪这些深度,Google Groups界面是一个很好的起点。
答案 2 :(得分:1)
没有。 C不是面向对象的语言。
我知道这是一个“绝对的答案”,你不想要,但我担心这是唯一的答案。原因是C不是面向对象的,因此它的任何部分都不能具有“面向对象的接口”。
在我看来,真正的面向对象涉及通过子类型多态性进行方法调度。如果一种语言缺乏这一点,它就不是面向对象的。
面向对象不是像GTK那样的“技术”。这是一种语言功能。如果语言缺少该功能,则它不是面向对象的。
如果面向对象仅仅是一种技术,那么几乎每种语言都可以称为面向对象,并且该术语将不再具有任何实际意义。
答案 3 :(得分:1)
从学术上讲,当然实际文件是对象。它们具有属性,您可以对它们执行操作。并不意味着 FILE 是一个类,只是说,有一定程度的OO-ness需要考虑。
然而,尝试说stdio FILE接口符合OO的麻烦在于,stdio FILE接口并不能很好地表示文件的“对象性”。您可以在OO方式下使用普通旧C下的FILE,但当然您会丧失Java或C ++提供的语法清晰度。
可能还应该进一步补充说,虽然你不能从FILE生成'继承',但这进一步取消了它作为OO的资格,但是你可能会认为它更多地是它的环境(普通C)的错误而不是它的抽象概念。 file-as-object本身。
实际上......你可能可能为FILE做一个类似java接口的案例。在linux世界中,您可以通过open / close / read / write / ioctl调用操作几乎任何类型的I / O设备; FILE功能只是覆盖在其上的;因此在FILE中你有一个类似于抽象类的东西,它定义了'abstact i / o device'上的基本操作(open / read / etc),将它留给了各种各样的派生的类型将那些具有特定类型行为的人充实。
当然,很难在一堆C代码中看到OO,并且很容易打破抽象,这就是为什么现在的实际OO语言如此受欢迎。
答案 4 :(得分:1)
这取决于。你如何定义“面向对象的界面”?正如对abelenky帖子的评论所示,很容易构造一个FILE是面向对象的论证。这取决于你所说的“面向对象”。它没有任何成员方法。但它确实具有特定的功能。
它不能从“传统”意义上得出,但似乎确实是多态的。在FILE指针后面,实现可以有很大的不同。它可能是一个文件,它可能是内存中的缓冲区,也可能是套接字或标准输出。
是封装的吗?好吧,它基本上是作为指针实现的。除非您在其上调用适当的API函数,否则无法访问文件所在位置的实现细节,甚至文件名称。这听起来像是封装在我身上。
答案基本上就是你想要的。如果您不希望FILE面向对象,那么以FILE无法实现的方式定义“面向对象”。
答案 5 :(得分:1)
C具有面向对象的前半部分。 封装,如果你可以有复合类型,如FILE *或结构但你不能继承它们,这是第二个(虽然不太重要)的一半
答案 6 :(得分:0)
oo有不同的定义。我觉得最有用的是以下(灵感来自Alan Kay):
这意味着您可以在任何命令式编程语言中以面向对象的方式编程 - 甚至是汇编程序。一个纯粹的函数式语言没有状态变量,这使得oo不可能或者至少很难实现(记住:LISP 不纯粹!);同样应该用于纯粹的声明性语言。
在C中,消息传递通常实现为函数调用,其指针指向将对象的状态保存为第一个参数的结构,这是文件处理api的情况。尽管如此,C语言不能归类为oo,因为它没有对这种编程风格的语法支持。
另外,oo的其他一些定义包括基于类的继承(那么原型语言怎么样?)和封装 - 这在我看来并不是真正必要的 - 但是其中一些可以用C实现一些指针 - 并施展魔法。