什么是“抽象”?

时间:2013-08-09 07:18:18

标签: c++ abstraction

我一直在阅读Stroustrup的“The C ++ Programming Language”,他提到了很多“抽象”:

  

许多最灵活,最有效和最有用的抽象涉及类型(类)和算法(函数)与其他类型和算法的参数化

  

C ++是一种用于开发和使用优雅高效抽象的语言。

这与C ++中的抽象类有什么关系?或者使用多态,继承或模板?

有人可以举个例子吗?

3 个答案:

答案 0 :(得分:15)

  

抽象 n ) - 处理想法而不是事件的质量

     

- 来源:Oxford English Dictionary

Stroustrup并不是指编程中的抽象类或其他特定的想法。相反,他指的是抽象本身这个词。

抽象是精神助手。它们帮助我们思考“理论”而不是直接应用。数学是抽象的艺术。编程是应用抽象的艺术。

抽象帮助我们形成心理模型,例如层次结构,以帮助我们思考事物。由于抽象,多态性是可能的。我们来看一个例子。

实施例

1st level

我有一个Oleksiy Dobrodum。我把它称为Oleksiy Dobrodum,我把它当作Oleksiy Dobrodum,它将永远是Oleksiy Dobrodum。我对Oleksiy Dobrodum所做的一切都是专门为它做的。我们现在处于第一级抽象,或者是我们与Oleksiy Dobrodum合作时最具体的。

最近我收购了Zach Latta,所以现在我有Oleksiy Dobrodum和Zach Latta。

More 1st level

我可以单独提及它们,如Oleksiy Dobrodum和Zach Latta,但这会很快变得多余并证明不灵活。相反,我们可以简单地将Oleksiy Dobrodum和Zach Latta组合在一起并称之为人类。我们现在已经实现了抽象级别2.我们可以将它们称为人类,而不是单独处理每个人。通过这样做,我们抽象出了“实现”或每个人的具体细节,并开始关注这些想法,因此我们现在正在抽象地思考。

More 2nd level

当然,我们可以进一步抽象,但希望你开始了解抽象背后的想法。从中可以看出,抽象隐藏了细节(或实现)。通过将细节隐藏在我们的人类抽象中,我们允许自己说出一般性。我们将在下一节中简要介绍一下如何将其应用于编程中。

应用抽象

现在我们已经简要地谈到了抽象是什么,让我们应用它。由于抽象,多态性是可能的。按照前一个例子的模型,假设我们有以下两个类:

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

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

Class diagram for code above

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

关键要点

  • 抽象是想法,而不是特定事件
  • 抽象的东西是摆脱它的实现并思考重要的想法
  • 抽象可以用来有效地组织代码(以及许多其他事情)
  • 面向对象编程完全依赖于抽象。见上面的要点。

答案 1 :(得分:2)

在通用编程中,抽象具有精确的含义,被称为“概念”。一个概念是defined as follows

概念是一组需求,包括有效表达式,关联类型,不变量和复杂性保证。据说满足要求的类型是对概念进行建模。概念可以扩展另一个概念的要求,称为细化。

  • 有效表达式是C ++表达式,必须成功编译表达式中涉及的对象才能被视为概念的模型。
  • 关联类型是与建模类型相关的类型,因为它们参与一个或多个有效表达式。通常,可以通过嵌套在建模类型的类定义中的typedef来访问关联类型,也可以通过traits类访问它们。
  • 不变量是必须始终为true的对象的运行时特性,即涉及对象的函数必须保留这些特征。不变量通常采用前置条件和后置条件的形式。
  • 复杂性保证是对其中一个有效表达式的执行需要多长时间的最大限制,或者是计算将使用多少资源的最大限制。 C ++标准库中使用的概念记录在SGI STL site

可以通过多种方式将概念实现为实际代码。经典的OOP方法是编写一个提供有效表达式和相关类型的抽象基类。然后,具体的派生类提供不变量和复杂性保证。对于模板,有效表达式更隐式,仅在实例化后检查。实现概念的模板是duck typing的一种形式:如果它看起来像鸭子,就像鸭子一样嘎嘎叫......

C ++ 0x开发过程devoted a lot of effort使概念直接表达为代码,但它是not incorporated into the C++11 Standard。但是,Concepts Lite版本可能会出现在下一个C ++ 14标准中。

答案 2 :(得分:1)

是的,它与c ++中的抽象类有关,而且不仅限于那个上下文,他用通用的方式解释说c ++完全支持抽象。

例如:在C ++中,我们可以使用其他类型的类类型或函数调用,例如函数调用可以有一个类类型/函数作为参数,函数和函数class引用表单抽象 - (这里抽象是指隐藏函数或类的定义来自用户)

相关问题