抽象 (n) - 处理想法而不是事件的质量
——来源:Oxford English Dictionary
Stroustrup 并不是指编程中的抽象类或其他特定思想。相反,他指的是抽象这个词本身。
抽象是精神上的帮手。它们帮助我们在“理论”中思考,而不是直接应用。数学是抽象的艺术。编程是应用抽象的艺术。
抽象有助于我们形成心智模型,例如层次结构,以帮助我们思考事物。由于抽象,多态是可能的。我们来看一个例子。
示例
我有一个 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 组合在一起并称他们为人类。我们现在已经达到了抽象级别 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
我们的类图现在如下所示:
我可以一直在谈论实施,但让我们继续讨论我们的关键要点。
关键要点
- 抽象是想法,而不是具体事件
- 抽象某事物就是从其实现中脱离出来,思考大创意
- 抽象可用于有效地组织代码(和许多其他东西)
- 面向对象的编程完全依赖于抽象。请参阅上面的要点。