c++ - 什么是 "abstractions"?

标签 c++ abstraction

我一直在阅读 Stroustrup 的“The C++ Programming Language”,他经常提到“抽象”:

Many of the most flexible, efficient, and useful abstractions involve the parameterization of types (classes) and algorithms (functions) with other types and algorithms

C++ is a language for developing and using elegant and efficient abstractions.

这与 C++ 中的抽象类有任何关系吗?或者使用多态性、继承或模板?

有人能举个例子吗?

最佳答案

abstraction (n) - the quality of dealing with ideas rather than events

— source: Oxford English Dictionary

Stroustrup 并不是指抽象类或编程中的其他具体思想。相反,他指的是抽象这个词本身。

抽象是精神上的 helper 。它们帮助我们思考“理论”而不是直接应用。数学是抽象的艺术。编程是应用抽象的艺术。

抽象帮助我们形成心智模型,例如层次结构,以帮助我们思考事物。由于抽象,多态性是可能的。让我们来看一个例子。

例子

1st level

我有一个 Oleksiy Dobrodum。我称它为 Oleksiy Dobrodum,我像对待 Oleksiy Dobrodum 一样对待它,它永远都是 Oleksiy Dobrodum。我对这个 Oleksiy Dobrodum 所做的一切都是专门为它做的。我们现在处于第一个抽象级别,或者说我们在使用这个 Oleksiy Dobrodum 时将达到的最具体的级别。

最近我买了一辆 Zach Latta,所以现在我同时拥有一辆 Oleksiy Dobrodum 和一辆 Zach Latta。

More 1st level

我可以将它们分别称为 Oleksiy Dobrodum 和 Zach Latta,但这很快就会变得多余并且证明不灵活。相反,我们可以简单地将 Oleksiy Dobrodum 和 Zach Latta 归为一类,并称他们为 Humans。我们现在已经达到抽象级别 2。我们可以将他们称为人类,而不是单独处理每个人。通过这样做,我们已经抽象出“实现”,或者每个人的具体细节,并开始关注想法,因此我们现在在抽象地思考。

More 2nd level

当然我们可以进一步抽象它,但希望您已经开始理解抽象背后的想法。从中得出的关键结论是抽象隐藏了细节(或实现)。通过将细节隐藏在我们人类的抽象中,我们允许自己笼统地说。我们将在下一节中简要讨论这如何应用于编程。

应用抽象

既然我们已经简要介绍了什么是抽象,那么让我们来应用它。由于抽象,多态性是可能的。按照前面示例的模型,假设我们有以下两个类:

class OleksiyDobrodum
  name = "Oleksiy Dobrodum"
  smarts = :mega-smart
  mood = :happy
  favorite_candy = :chocolate
end

class ZachLatta
  name = "Zach Latta"
  smarts = :so-so
  mood = :indifferent
  hair_color = :brown
end

如果我想与 ZachLatta 的实例进行交互,我必须具体引用它。 OleksiyDobrodum 实例也是如此。

zach = new ZachLatta
print zach.name

oleksiy = new OleksiyDobrodum
print oleksiy.favorite_candy

如果我创建一个名为 Human 的抽象类,并且 OleksiyDobrodumZachLatta 都继承自它,那么我可以抽象两个类的实现,并简单地将它们的两个实例称为Human

class Human
  name
  smarts
  mood
end

class OleksiyDobrodum < Human
  name = "Oleksiy Dobrodum"
  smarts = :mega-smart
  mood = :happy
  favorite_candy = :chocolate
end

class ZachLatta < Human
  name = "Zach Latta"
  smarts = :so-so
  mood = :indifferent
  hair_color = :brown
end

我们的类图现在如下所示:

Class diagram for code above

关于实现我可以一直滔滔不绝,但让我们继续讨论我们的要点。

要点

  • 抽象是想法,而不是具体事件
  • 抽象一些东西就是远离它的实现并思考大创意
  • 抽象可以用来有效地组织代码(以及许多其他东西)
  • 面向对象的编程完全依赖于抽象。请参阅上面的要点。

关于c++ - 什么是 "abstractions"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18141827/

相关文章:

node.js - 数据库客户端抽象

c++ - 物理和 std::numeric_limits<double>::epsilon()...我们何时以及为何需要它?

C++ 内存泄漏检查

java - 处理继承时重写 equals 方法

c++ - 将基类 vector 传递给采用父类(super class) vector 的函数

types - 数据结构、数据类型和抽象数据类型的区别

c++ - 试图绘制点云,只是 opengl 中心的一个点

c++ - 在不生成新 QMovie 的情况下更改 GIF 动画速度

c++ - 系统日志自定义优先级

programming-languages - 高级语言应该/将达到多高?