- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我的意思是,除了它的强制性名称(标准模板库)...
C++ 最初打算将 OOP 概念呈现到 C 中。也就是说:您可以根据其类和类层次结构来判断特定实体可以做什么和不能做什么(无论它如何做)。由于多重继承的问题,以及 C++ 以某种笨拙的方式支持接口(interface)概念的事实(与 java 等相比),一些能力的组合更难以用这种方式描述,但它就在那里(并且可能是改进)。
然后模板和 STL 一起发挥了作用。 STL 似乎采用了经典的 OOP 概念并将它们冲入下水道,而是使用模板。
当使用模板来泛化类型本身与模板(例如容器)的操作无关的类型时,应该区分情况。有一个 vector<int>
完全有道理。
然而,在许多其他情况下(迭代器和算法),模板化类型应该遵循一个“概念”(输入迭代器、前向迭代器等),其中概念的实际细节完全由模板的实现来定义函数/类,而不是与模板一起使用的类型的类,这在某种程度上是 OOP 的反用法。
例如,您可以告诉函数:
void MyFunc(ForwardIterator<...> *I);
template <typename Type> void MyFunc(Type *I);
最佳答案
简短的回答是“因为 C++ 已经向前发展了”。是的,早在 70 年代后期,Stroustrup 就打算创建具有 OOP 功能的升级版 C,但那是很久以前的事了。到 1998 年该语言标准化时,它已不再是 OOP 语言。它是一种多范式语言。它当然对 OOP 代码有一些支持,但它也覆盖了图灵完备的模板语言,它允许编译时元编程,人们发现了泛型编程。突然之间,OOP 似乎不再那么重要了。当我们可以通过使用模板和泛型编程提供的技术编写更简单、更简洁和更高效的代码时,情况并非如此。
OOP 不是 chalice 。这是一个可爱的想法,它比 20 世纪 70 年代发明的过程语言有了很大的改进。但老实说,这并不是它被破解的全部。在许多情况下,它笨拙而冗长,并没有真正促进可重用代码或模块化。
这就是今天 C++ 社区对泛型编程更感兴趣的原因,也是为什么每个人终于开始意识到函数式编程也非常聪明的原因。 OOP 本身并不是一个美丽的景象。
尝试绘制一个假设的“OOP 化”STL 的依赖图。有多少类(class)必须相互了解?会有很多依赖。你能不能只包括 vector
标题,也没有得到 iterator
甚至 iostream
拉进来了? STL 使这变得容易。 vector 知道它定义的迭代器类型,仅此而已。 STL 算法一无所知。它们甚至不需要包含迭代器头,即使它们都接受迭代器作为参数。哪个更模块化?
STL 可能不遵循Java 定义的OOP 规则,但它是否达到了OOP 的目标?不是实现了复用性、低耦合性、模块化和封装性吗?
它不是比 OOP 化版本更好地实现这些目标吗?
至于为什么 STL 被采用到语言中,发生了几件事导致了 STL。
首先,模板被添加到 C++ 中。添加它们的原因与将泛型添加到 .NET 的原因大致相同。能够在不丢弃类型安全的情况下编写诸如“T 类型的容器”之类的东西似乎是一个好主意。当然,他们确定的实现要复杂得多,而且功能强大得多。
然后人们发现他们添加的模板机制比预期的更强大。有人开始尝试使用模板来编写更通用的库。一种受函数式编程启发,另一种使用 C++ 的所有新功能。
他将它提交给了 C++ 语言委员会,后者花了很长时间才适应它,因为它看起来如此奇怪和不同,但最终意识到它比他们必须以其他方式包含的传统 OOP 等价物更有效。所以他们对其进行了一些调整,并将其纳入标准库。
这不是意识形态的选择,也不是“我们要不要OOP”的政治选择,而是一个非常务实的选择。他们评估了这个库,发现它运行良好。
无论如何,您提到的支持 STL 的两个原因都是绝对必要的。
C++ 标准库 有 高效。如果它比等效的手动 C 代码效率低,那么人们就不会使用它。这会降低生产力,增加出现错误的可能性,而且总体来说只是一个坏主意。
和 STL 有 使用原始类型,因为原始类型是 C 语言中的全部,而且它们是两种语言的主要部分。如果 STL 不适用于 native 数组,则为 没用 .
您的问题有一个强有力的假设,即 OOP 是“最好的”。我很想知道为什么。你问他们为什么“放弃经典的 OOP”。我想知道为什么他们应该坚持下去。它有哪些优势?
关于c++ - 为什么 C++ STL 如此大量地基于模板? (而不是在*接口(interface)*上),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1039853/
编写一个仅用于集中其他接口(interface)的接口(interface)是好的做法还是坏的做法? interface InterfaceA : InterfaceB, InterfaceC { }
有没有一种方法可以确定具体类型从任意接口(interface)列表?我知道类型转换,但我想知道所有满意的接口(interface)。 例如,给定: type Mover interface { Mo
我正在尝试制作斐波那契堆。 (在我正在上的算法课中多次提到它们,我想检查一下。)我希望堆使用任何类型的节点,所以我定义了一个 Node 接口(interface): package node type
这是我的代码: type IA interface { FB() IB } type IB interface { Bar() string } type A struct {
示例 A: // pseudo code interface IFoo { void bar(); } class FooPlatformA : IFoo { void bar() {
合并它编译的 leppies 反馈 - 但 IMO 有一些缺点,我希望编译器强制每个子类定义它们自己的 Uri 属性。现在的代码: [] type UriUserControl() = inh
我正在构建一个项目,该项目从用户那里获取一个术语,然后执行谷歌搜索并返回一个 json 格式的标题列表。 我正在使用 serpwow API 来执行谷歌搜索并试图解析响应。 但是我收到的错误是: pa
我只想在其他接口(interface)中实现某些接口(interface),我不希望它们能够被类直接继承。 提前致谢! 最佳答案 您不能在 C# 中执行此操作 - 任何类都可以实现它有权访问的任何接口
我是 Go 的新手,还有一些我还没有掌握的技巧 例如,我有一个可以这样调用的函数: myVar.InitOperation("foo",Operator.EQUAL,"bar") myVar.Init
我有一个通用接口(interface)来描述对输出流的访问,如下所示: interface IOutput { function writeInteger(aValue:Int):Void;
我正在做一个项目,我想通过某种接口(interface)(最好是 USB)将光电探测器电路安装到计算机上。但是,由于我是新手,所以我不知道应该朝哪个方向处理这个问题。假设我有一个带有 USB 连接的光
背景 我正在尝试创建一个简单的应用程序,以真正理解DDD + TDD + etc的整个堆栈。我的目标是在运行时动态注入DAL存储库类。这让我 域和应用程序服务层可测试。我打算用“穷人的DI”来完成 现
在 Java 中,接口(interface)扩展接口(interface)是完全合法的。 UML 中的这种关系看起来像“扩展”关系(实线、闭合、未填充的箭头)还是“实现”关系(虚线、闭合、未填充的箭头
我想创建一个具有相等和比较函数默认实现的接口(interface)。 如果我从类型 IKeyable 中删除所有内容除了Key成员,只要我不添加默认实现,它就是一个有效的接口(interface)。从
COM 中的双接口(interface)是能够通过 DispInterface 或 VTable 方法访问的接口(interface)。 现在有人可以告诉我这两种方法之间到底有什么区别吗? 我认为 V
我有一个类方法,它返回一个可以迭代的员工列表。返回列表的最佳方式是什么?通常我只返回一个 ArrayList。然而,据我了解,界面更适合这种类型的操作。哪个是最好使用的界面?另外,为什么返回接口(in
我想从包装类外部实例化一个内部非静态接口(interface)。 这可能吗? 考虑以下代码: shared class AOuterClass() { Integer val = 3; shared
我为一个类编写了一个接口(interface),如下所示: public interface IGenericMultipleRepository { Lazy> addresses { ge
我是 UML 的初学者,现在我正在创建一个序列图,问题是我想根据用户输入实现 DAO 接口(interface)。如何在时序图中正确绘制以实现接口(interface)。 最佳答案 您不会在 SD 上
要使用 jsr 303 验证创建有条件验证的组,请将接口(interface)类传递给注释,如下所示: @NotEmpty (groups={UpdateValue.class}) 我有很多不同的接口
我是一名优秀的程序员,十分优秀!