我一直在阅读 Stroustrup 的“The C++ Programming Language”,他经常提到“抽象”:
许多最灵活、最有效和最有用的抽象涉及类型(类)和算法(函数)与其他类型和算法的参数化
和
C++ 是一种用于开发和使用优雅高效抽象的语言。
这与 C++ 中的抽象类有什么关系吗?还是使用多态、继承或模板?
有人可以举个例子吗?
我一直在阅读 Stroustrup 的“The C++ Programming Language”,他经常提到“抽象”:
许多最灵活、最有效和最有用的抽象涉及类型(类)和算法(函数)与其他类型和算法的参数化
和
C++ 是一种用于开发和使用优雅高效抽象的语言。
这与 C++ 中的抽象类有什么关系吗?还是使用多态、继承或模板?
有人可以举个例子吗?
抽象( 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
并同时拥有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
我们的类图现在如下所示:
我可以一直在谈论实施,但让我们继续讨论我们的关键要点。
在泛型编程中,抽象具有精确的含义,被称为“概念”。一个概念定义如下:
概念是一组由有效表达式、关联类型、不变量和复杂性保证组成的需求。满足要求的类型被称为对该概念进行建模。一个概念可以扩展另一个概念的要求,这称为细化。
可以通过多种方式将概念实现到实际代码中。经典的 OOP 方法是编写一个提供有效表达式和相关类型的抽象基类。然后具体派生类提供不变量和复杂性保证。对于模板,有效表达式更加隐含,并且仅在实例化后检查。模板实现概念是鸭子类型的一种形式:如果它看起来像一只鸭子,那么嘎嘎就像一只鸭子,......
C++0x 开发过程付出了很多努力,使概念可以直接表达为代码,但它没有被纳入 C++11 标准。但是,Concepts Lite版本很可能会出现在下一个 C++14 标准中。
是的,它与 c++ 中的抽象类有关,并且不限于该上下文,他以通用的方式解释说 c++ 完全支持抽象。
例如:在C++中,我们可以使用类类型或其他类型中的函数调用,例如函数调用可以有一个类类型/函数作为参数,函数和类都指一种形式抽象——(这里的抽象指向用户隐藏函数或类的定义)