STL中的继承问题

PSkocik

http://www.stepanovpapers.com/notes.pdf中,亚历山大·斯蒂芬诺夫(Alexander Stepanov)提到:

有趣的是,保留在STL中的唯一继承示例是从空类继承的。最初,容器甚至是迭代器内部都有许多继承用途,但是由于它们引起的问题而不得不将其删除。

STL中无法使用继承的哪些技术问题?

LookAheadAtYourTypes

我想我会直接从Alexander Stepanov(http://www.stlport.org/resources/StepanovUSA.html发表一些评论

问题:

STL充满了模板的创造性用法,例如从类导出的符号类型,或者将一组重载算法与迭代器标签进行模式匹配。确实,没有标准的C ++编程书谈到这些惯用法。您是怎么想到这些C ++代码习惯用法的?

回答:

我确切地知道我要完成的工作。所以我调整了语言,直到我能通过为止。但是我花了很多年才发现所有技术。而且我有很多错误的开始。例如,在了解为什么该机制从根本上存在缺陷并且不应该使用该机制之前,我花了多年的时间试图为继承和虚拟化找到某种用途。我很高兴没有人看到所有中间步骤-其中大多数都很傻。我花了几年的时间才想出一半不错的东西。Bjarne愿意在语言中添加某些功能只是为了启用我的一些习语,这也有所帮助。他曾经称其为“及时语言设计”。

接下来,我将指导自己找到这个好答案:

https://stackoverflow.com/a/1039904/210971

OOP不是圣杯。这是一个可爱的主意,与70年代的程序语言相比,它是一个很大的改进。坦白说,这并不是全部。在许多情况下,它笨拙且冗长,并且实际上并没有促进可重用的代码或模块化。

这就是为什么C ++社区今天对通用编程更感兴趣,以及为什么每个人都终于开始意识到函数式编程也非常聪明的原因。单独的OOP并不是很漂亮。

现在从我这里得到一些东西:

OOP规则规定了程序员思考事物(对象,实体,tribbles等)之间的交互的方式(继承性,多态性等)。

在添加对泛型的支持之前,这在简单的Java示例中就可以清楚地看到(但是这些不像在C ++中那样冗长)。

List v = new ArrayList();
v.add("test");
Integer i = (Integer)v.get(0); // Run time error

尽管代码编译没有错误,但是在执行第三行代码时会抛出运行时异常(java.lang.ClassCastException)。通过使用泛型可以避免这类问题,这是使用泛型的主要动机。

List<String> v = new ArrayList<>();
v.add("test");
Integer i = v.get(0); // (type error)  compilation-time error

Alexander Stepanov认识到通用方法可以解决此问题,有助于在数据结构和算法之间提供逻辑隔离(抽象)。这就是为什么如此强调迭代器,函子和许多其他非常适合泛型世界的习语的原因。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章