【问题标题】:What are "abstractions"?什么是“抽象”?
【发布时间】:2013-08-09 07:18:17
【问题描述】:

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

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

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

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

有人可以举个例子吗?

【问题讨论】:

  • 想象一下完成一项任务需要做很多工作。现在想象他们是一个简单的功能来做到这一点。瞧,一个抽象。
  • B.Stroustrup (stroustrup.com/glossary.html) - 抽象 - 指定通用接口隐藏实现细节的行为。类、抽象类和模板是 C++ 中的主要抽象机制。另请参阅:封装。
  • 请重新打开这个问题,there is a proper answer to it

标签: c++ abstraction


【解决方案1】:

抽象 (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 的抽象类并同时继承了 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

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

我可以一直在谈论实施,但让我们继续讨论我们的关键要点。

关键要点

  • 抽象是想法,而不是具体事件
  • 抽象某事物就是从其实现中脱离出来,思考大创意
  • 抽象可用于有效地组织代码(和许多其他东西)
  • 面向对象的编程完全依赖于抽象。请参阅上面的要点。

【讨论】:

  • 你能举个例子吗?
  • @Zach Latta:我同意并支持您的回答,但抽象不仅仅是心理助手和心理模型。他们组织实际的代码。
  • @juanchopanza:你知道有多少抽象实际上不会影响代码组织吗?你认为大多数人会吗?
  • @Frodo 民族、国家或民族国家的概念从未帮助我组织代码。
  • 感谢扎克的精彩回答!我相信它也会帮助其他人!干杯
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 它实际上比抽象类更广泛。例如,在编写泛型编程(模板)时,您需要处理抽象:参数的确切类型未知,但您确实有一些期望。
    猜你喜欢
    • 2011-06-13
    • 2011-10-25
    • 2012-11-29
    • 2019-05-07
    • 2011-01-18
    • 2011-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多