代码之家  ›  专栏  ›  技术社区  ›  Roger Pate

C的文件有面向对象的接口吗?

oop c
  •  4
  • Roger Pate  · 技术社区  · 15 年前

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

    我在寻找理性的观点,而不是绝对的答案,因为OO的定义因你问的人而异。它满足或不满足的重要OO概念是什么?

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

    7 回复  |  直到 15 年前
        1
  •  1
  •   JustJeff    15 年前

    从学术角度来说,当然 实际文件 物体 . 它们有属性,您可以对它们执行操作。并不意味着 文件 是一个 只是说,有一些程度的OO需要考虑。

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

    应该进一步补充的是,虽然您不能从文件生成“继承”,但这进一步取消了它作为OO的资格,但是您可以争辩说,与其将文件作为对象本身的抽象概念,不如说是它的环境(普通C)的错误。

    事实上…你可以 可能 为文件做一个类似Java接口的例子。在Linux世界中,您可以通过open/close/read/write/ioctl调用操作几乎任何类型的I/O设备;文件函数仅覆盖在这些函数之上;因此,在文件中,您有一个类似抽象类的东西,它定义了“abstract I/O设备”上的基本操作(open/read/etc),将其留给各种类型的I/O设备。 衍生的 类型通过特定于类型的行为来充实它们。

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

        2
  •  3
  •   abelenky    15 年前

    C是一种面向对象的语言吗?

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

    回答这些问题会回答你的问题。

    编辑:

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

    Inheritence: 可以从文件派生新类吗?

    多态性: 你能把派生类当作文件吗?

    封装: 你能把文件放在另一个物体里吗?

    方法和属性: 文件是否有特定的方法和属性?(例如) myfile.name,myfile.size,myfile.delete())

    虽然有众所周知的C“技巧”来完成类似于这些行为的每一个行为,但这不是内置到文件中的,也不是最初的意图。

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

        3
  •  3
  •   3 revs<br/>anon&#13;    15 年前

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

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

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

    对于你们中的那些想陷入疯狂和愚蠢的深渊的人来说,这是一个新闻组,在几年前,这个话题在那里被非常详尽地讨论过,尽管是由那些愚蠢的人讨论的。如果你想拖网这些深度, Google Groups 界面是一个很好的开始。

        4
  •  1
  •   Stack Overflow is garbage    15 年前

    这要看情况而定。你如何定义一个“面向对象的接口”?正如Abbelenky文章的注释所示,很容易构造一个参数,即文件是面向对象的。这取决于你所说的“面向对象”。它没有任何成员方法。但它确实有特定的功能。

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

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

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

        5
  •  1
  •   Martin Beckett    15 年前

    C的前半部分是面向对象的。 封装,也就是说,您可以有复合类型,如file*或structs,但不能从它们继承,后者是第二个(尽管不太重要)半部分

        6
  •  1
  •   Gregory Higley    15 年前

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

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

    澄清:

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

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

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

        7
  •  0
  •   Christoph    15 年前

    关于OO有不同的定义。我发现最有用的是以下内容(受Alan Kay的启发):

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

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

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

    另外,OO的一些其他定义包括基于类的继承(那么原型语言呢?)封装——在我看来这并不是真正必要的——但是其中一些可以用C语言实现,并具有一些指针和强制转换的魔力。