我一直在阅读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的抽象类,并且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

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

我可以永远在实现方面徘徊,但让我们继续进行重点介绍。

重要要点
  • 抽象是思想,不是特定事件
  • 抽象一些东西是远离其实现,并考虑一些大想法
  • 抽象可用于有效地组织代码(以及许多其他事情)
  • 面向对象的编程完全依赖于抽象。请参阅上面的要点。
  • 关于c++ - 什么是 "abstractions"?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18141827/

    10-09 12:27