【问题标题】:How C programming language doesn't apply OOP concepts? [closed]C 编程语言如何不应用 OOP 概念? [关闭]
【发布时间】:2021-06-12 15:59:17
【问题描述】:

据我所知,C 不是面向对象的编程语言。我们如何制作用户定义的数据类型并允许对这些数据类型执行一些操作。就像定义原始数据类型并允许对它们执行一些操作一样。

【问题讨论】:

  • 因为 C 是在 OOP 流行之前发明的。 C可以被看作是半可移植的汇编语言。无论如何,可以将 OOP 应用到 C 程序中。
  • GTK GUI 工具包是开源的,它展示了如何用 C 编写面向对象的程序。我建议研究它的文档和源代码。 GNU guile 解释器具有面向对象的特性,并且是用 C 编码的免费软件。我建议研究它的文档和源代码。至少预算一整月的工作。
  • 实现抽象或数据隐藏的一种非常简单的方法是使用不透明指针。我建议你查一下
  • 你可以看到nullprogram.com/blog/2014/10/21。它是关于 Linux 内核中使用的 OOP 技术。您必须知道,必须非常精通 C 才能理解正确有效地使用它。
  • Re “这让我想知道这些值是如何开发的?”:C 包括在语言中指定并内置于编译器中的基本类型:charintfloat 、指针等,它们的值遵循语言规则。派生类型,特别是数组和结构,可以从它们构建,它们的值和含义来自写入程序的代码。编写此类代码的技术没有限制;程序员可以根据需要使用 OOP 技术或其他技术。

标签: c oop types ansi-c


【解决方案1】:

没有面向对象的语言。只有不同程度的面向对象特性支持的语言。 OO 是一种程序设计方法,因此它主要与语言无关。

OO大致可以概括为三件事:

  • 执行自己指定任务的自治模块,对周围程序的了解有限。 (“松散耦合”)

  • 数据和函数的私有封装,这样类的用户就不必担心哪些部分是内部的,哪些是API的一部分。防止意外或故意滥用内部构件。减少“命名空间混乱”。

  • 继承和多态,可用于代码重用和API设计。

第一种是纯程序设计,也是人们最常出错的一种。 2nd 和 3rd 由 C 支持,但隐含且不是很优雅。

对于私有封装,您可以使用static 文件范围变量。它在某些情况下可以正常工作,例如单核嵌入式系统。但它在其他情况下会出现问题 - 它使您的类成为“单例”单个实例并使其成为线程不安全的。

您可以使用 不透明类型 的概念进行更适当的私有封装,其中您转发声明一个结构,然后仅在调用者不可见的文件中定义该结构。这为您提供了真正的多实例私有封装,并且在与函数指针结合使用时也可用于多态性。不利的一面是它有点麻烦,而且没有多少人意识到它。学校不教它。

因此,完全可以用 C 语言编写 OO 程序,就像完全可以用 C++ 或 Java 进行损坏的非 OO 设计一样。如果您有语言支持,那么执行 OO 会容易得多。

例如“RAII”的 C++ 概念,严格来说,它本身并不是一个 OO 特性,但它在进行 OO 设计时有很大帮助,因为它为您提供了隐式的构造函数/析构函数调用,而您没有必须依赖调用者明确地执行它们,就像在 C 中的情况一样。另一个例子是强大的方便 this 指针,在 C 中你必须手动将它传递给每个函数调用。

【讨论】:

  • “第 2 和第 3 由 C 支持,但隐含且不是很优雅。” - 我会说即使这是一个很长的延伸。我宁愿说类似 “在 C 中模仿继承和多态性是可能的,但它非常笨重,很少值得付出努力。”
  • 我宁愿说可靠的封装是困难的。常见的方法是添加_ 后缀并注释给定成员是私有的。 Python中也有类似的情况。
  • RAII 可以在 C 中模拟。必须将所有函数指针打包到给定类的所有成员共享的专用结构中。然后指向这个ops 结构的指针成为类的标识符。两个对象可以通过比较它们的ops== 运算符来检查它们是否属于同一个派生类
  • @klutt 这一点都不难。对于您用 C 编写的任何 API,您很可能会传递一个结构体。因此,只需使用户无法访问内容即可。至于多态性,用任何语言实现都是相当笨拙的......只是因为如果你把基类弄错了,你很容易得到很多奇怪的接口和毫无意义的元编程。
  • @Lundin,你说得对,我想到了RTTI。很抱歉造成混乱
猜你喜欢
  • 2011-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多