9

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

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

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

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

有人可以举个例子吗?

4

3 回答 3

14

抽象( 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

如果我想与一个实例交互,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

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

上面代码的类图

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

关键要点

  • 抽象是想法,而不是具体事件
  • 抽象某物就是远离它的实现并思考大的想法
  • 抽象可用于有效地组织代码(和许多其他东西)
  • 面向对象的编程完全依赖于抽象。请参阅上面的要点。
于 2013-08-09T07:23:43.850 回答
2

在泛型编程中,抽象具有精确的含义,被称为“概念”。一个概念定义如下

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

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

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

C++0x 开发过程付出了很多努力,使概念可以直接表达为代码,但它没有被纳入 C++11 标准。但是,Concepts Lite版本很可能会出现在下一个 C++14 标准中。

于 2013-08-09T08:18:05.083 回答
1

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

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

于 2013-08-09T07:38:30.993 回答