我一直在阅读Stroustrup的"The C++ Programming Language",他提到了很多"抽象":
许多最灵活,最有效和最有用的抽象涉及类型(类)和算法(函数)与其他类型和算法的参数化
和
C++是一种用于开发和使用优雅高效抽象的语言.
这与C++中的抽象类有什么关系?或者使用多态,继承或模板?
有人可以举个例子吗?
Zac*_*tta 15
抽象(n) - 处理想法而不是事件的质量
- 来源:牛津英语词典
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
Run Code Online (Sandbox Code Playgroud)
如果我想与一个实例进行交互,ZachLatta我必须具体参考它.这同样适用于OleksiyDobrodum实例.
zach = new ZachLatta
print zach.name
oleksiy = new OleksiyDobrodum
print oleksiy.favorite_candy
Run Code Online (Sandbox Code Playgroud)
如果我创建一个名为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
Run Code Online (Sandbox Code Playgroud)
我们的类图现在如下所示:

我可以永远地谈论实施,但让我们继续我们的关键要点.