我一直在阅读 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 。它们帮助我们思考“理论”而不是直接应用。数学是抽象的艺术。编程是应用抽象的艺术。
抽象帮助我们形成心智模型,例如层次结构,以帮助我们思考事物。由于抽象,多态性是可能的。让我们来看一个例子。
例子
我有一个 Oleksiy Dobrodum。我称它为 Oleksiy Dobrodum,我像对待 Oleksiy Dobrodum 一样对待它,它永远都是 Oleksiy Dobrodum。我对这个 Oleksiy Dobrodum 所做的一切都是专门为它做的。我们现在处于第一个抽象级别,或者说我们在使用这个 Oleksiy Dobrodum 时将达到的最具体的级别。
最近我买了一辆 Zach Latta,所以现在我同时拥有一辆 Oleksiy Dobrodum 和一辆 Zach Latta。
我可以将它们分别称为 Oleksiy Dobrodum 和 Zach Latta,但这很快就会变得多余并且证明不灵活。相反,我们可以简单地将 Oleksiy Dobrodum 和 Zach Latta 归为一类,并称他们为 Humans。我们现在已经达到抽象级别 2。我们可以将他们称为人类,而不是单独处理每个人。通过这样做,我们已经抽象出“实现”,或者每个人的具体细节,并开始关注想法,因此我们现在在抽象地思考。
当然我们可以进一步抽象它,但希望您已经开始理解抽象背后的想法。从中得出的关键结论是抽象隐藏了细节(或实现)。通过将细节隐藏在我们人类的抽象中,我们允许自己笼统地说。我们将在下一节中简要讨论这如何应用于编程。
应用抽象
既然我们已经简要介绍了什么是抽象,那么让我们来应用它。由于抽象,多态性是可能的。按照前面示例的模型,假设我们有以下两个类:
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
的抽象类,并且 OleksiyDobrodum
和 ZachLatta
都继承自它,那么我可以抽象两个类的实现,并简单地将它们的两个实例称为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
我们的类图现在如下所示:
关于实现我可以一直滔滔不绝,但让我们继续讨论我们的要点。
要点
- 抽象是想法,而不是具体事件
- 抽象一些东西就是远离它的实现并思考大创意
- 抽象可以用来有效地组织代码(以及许多其他东西)
- 面向对象的编程完全依赖于抽象。请参阅上面的要点。
关于c++ - 什么是 "abstractions"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18141827/