我一直在阅读Stroustrup的“C++编程语言”,他经常提到“抽象”:
和
这与C++中的抽象类有任何关系吗?还是使用多态,继承或模板?
有人可以举个例子吗?
最佳答案
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
现在,我们的类图如下所示:
我可以永远在实现方面徘徊,但让我们继续进行重点介绍。
重要要点
关于c++ - 什么是 "abstractions"?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18141827/