【问题标题】:How is C not object oriented? [duplicate]C如何不是面向对象的? [复制]
【发布时间】:2012-05-27 18:03:22
【问题描述】:

可能重复:
Can you write object oriented code in C?
Object oriented programming in C

所以,据我所知,“对象”基本上只是值和方法的包装器。你不能在 C 语言中拥有与structs 相同的功能吗? struct 看起来就像一个简单的class,但是,当然,它没有任何方法。在这里,我们进入了我的问题的核心:我根本不明白为什么需要方法。如果我们有一个外部函数,它只接受一个指向struct 实例的指针,难道不是更简单、更节省内存吗?或者甚至让structs 有指向这些函数的指针,但这似乎纯粹是美学......

【问题讨论】:

  • 确实,不将方法绑定到类意味着您可以拥有可以专门处理多个参数的泛型函数,而不仅仅是“this”——我们开始了解CLOSgeneric functions(这与其他语言中类似名称的事物无关,除了 Dylan)。
  • 如果我们有一个外部函数,它只接受一个指向结构实例的指针,难道不是更简单、更节省内存吗?当您将成员函数添加到结构时,C++ 中会发生什么。编译器将它们移到“外部”并在调用中添加一个this 指针。
  • 你认为面向对象的语言(Java、Python、Ruby)大部分都是用C实现的,所以是的,当然C也可以是面向对象的。但这并不意味着它很容易或方便。

标签: c oop class architecture struct


【解决方案1】:

使用 c 风格的函数指针作为结构成员,确实可以让 C 面向对象。

我喜欢将一个类的属性和方法全部定义在一起的概念。它更容易看到相关实体是什么,而不是像你提到的那样拥有指向结构的指针的单独函数。

这里有 2 个相关的 SO 问题:

Is there a simple way to code the strategy (or other) design pattern in ANSI C that would fit on the screen of an 11" MacBook Air?

How do function pointers in C work?

【讨论】:

    【解决方案2】:

    您的建议已用于在 C 中实现 OO 功能。但许多人发现使用包含 OO 功能的专用语言更容易。

    这与人们从汇编转向 C 的趋势相同。

    【讨论】:

      【解决方案3】:

      对象是现实世界的实体,它具有状态、行为。在 class(c++/java) 中,我们可以将状态定义为成员变量,将函数定义为行为。在 C: in struct 的情况下,您可能有状态但没有行为。因此C不是面向对象的。这只是一个小例子。此外,C 也不支持 OOPS 原则,如继承、函数重载、多态等。

      【讨论】:

      • 如果将函数指针作为结构的成员会怎样?
      • @Brady 你能用 C 实现继承吗?
      • 是的,你可以,但它肯定不像在 C++/java/python 中那样直接。看看我的答案中的链接,看看如何。
      • 是的,你可以。我在策略模式中做到了,尽管该函数在基类/结构中是抽象的。您所要做的就是在派生类构造函数中相应地分配函数指针。
      • 我会避免使用它来这样做:) 但是是的,它可以做到。
      【解决方案4】:

      面向对象意味着开箱即用地面向对象。当然,您可以使用 C(以及许多其他非 OO 语言)模拟面向对象,但如果该语言(和/或其标准库)不能以任何方式帮助您(特殊语法、标准对象等)和默认不鼓励写OO风格,不会被称为面向对象的。

      【讨论】:

        猜你喜欢
        • 2011-03-05
        • 2011-05-05
        • 2012-03-02
        • 2010-11-15
        • 2023-03-31
        • 1970-01-01
        • 2011-06-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多