level 15
在查traits的时候,似乎发现了有两种东西。
一种是STL里面的特性萃取,一种是PHP等语言里面的用来处理多重继承问题的概念。
请问这两者的本质是相同的吗?还是说,是完全不同的东西,只不过都叫同一个名字呢?
谢谢...
2017年12月12日 15点12分
1
level 15
都是一些可重用的方法的集合,用来扩展类的功能。PHP里正是因为只有方法,所以能解决菱形继承的问题……好吧我编不下去了,我其实不会PHP,以上都是我从维基里抄的。
2017年12月12日 17点12分
4
咱书读的少不要忽悠咱
2017年12月12日 17点12分
level 15
traits和继承没什么关系。C*里继承只是恰好容易实现也容易用,干脆标准化要求基类了。
当然,你要干掉上面浮夸的玩意儿,都可以看成是对类型系统本身进行操作。不过基本上废柴静态语言都不会给你提供这个方面的可编程性(撑死了什么“编译时反射”),所以不用指望了。
2017年12月14日 14点12分
8
非常感谢!在下一定认真阅读理解
2017年12月14日 15点12分
level 15
太零碎,抽了重写。
C++这样静态类型的静态语言提供的所谓traits一般可以理解成基于合式(well-formed)的构造,对应典型实现中符号表中项的存在性,以及基于这些性质的中能保证在翻译阶段(phase of translaton)即能给出确定结果的函数(所谓“元函数(metafunction)”)。
用Lisp的术语来讲,符号表实现了一个求值环境(evaluation environment)。几乎所有的语言(包括通常意义上的Lisp)不会暴露一等环境(first-class environment)作为语言特性,而静态语言经常根本不会明确存在这样的抽象(反正告诉你你也没法自己改里面的内容,否则就不静态了)。提供一等环境的语言(如Kernel)可以允许用户以一致的情况下同时提供不同阶段(phase)的抽象,因此不需要宏(macro)这种单独阶段变换就能实现更一般的功能,同时不增加针对特定阶段的特别规则。退一步,单独提供卫生宏(hygienc macro)是Scheme等语言的做法,这种做法要求分离阶段,但仍然允许保持语法上和语言中的其它形式表示一致。相比之下,ISO C和ISO C++规则在这里就复杂得多,逻辑上都要求分为不少于7个翻译阶段(phase of translation)——这还不包括后面的运行;其中,宏展开在第4阶段——还有不受作用域规则限制的污染(所以不卫生)和相当大的和后续阶段语法不一致的特别规则。
C++2a提议的metaclass是不完全保留一致的比卫生宏更弱的设计。而模板则是另外几种限定了翻译阶段而且和静态类型系统有不止一腿混乱关系的特性的总称。这几类特性可以实现部分用卫生宏的设计,但甚至还没有能力在实用时完全取代原有的宏,而复杂性谁用谁知道(虽然一部分来自于静态类型系统必然的无能,以及C++静态类型兼容历史包袱的特别的无能,但特性本身的规则冗余也是重要原因),所以相当地鸡肋。
至于类和继承之类的琐碎高层特性,在已知实现使用的ABI和对布局进行抽象的特性之后,不值一提——只要基本的特性够用,总是相当容易实现。限定支持或禁止多继承除了提供维持可移植的样例外,对足够通用的语言几乎毫无意义;只不过这些语言的抽象能力和表达能力都太弱,无法随便让用户在语言中利用组合现有的基本特性添加这类特性而已。
在表达能力足够强的语言中,用户可以自行实现语义规则,包括对各个阶段的类型编码成特定的数据结构并添加类型检查(因此静态类型总是必然具有缺陷——只要用户能发现现有的内建静态类型系统不够好用而又不得不克服缺陷的时候——在C++这样历史包袱严重的语言中尤其容易遇到)。在静态类型语言中,类可以作为一种静态类型,基于记录类型(record type)(如C那样的结构体类型)或更一般积类型(product type)(如元组(tuple))这样类型理论中特定基类基础组合类型的特例进行抽象。(也有直接设计使用类的类型代数,但太复杂。)所谓的抽象类是特殊的包含未完全实现的函数作为其方法(“抽象方法”)的类。所有方法都是抽象方法的类即所谓的接口。而“继承”是类之间的元函数:输入超过一个不同的类作为基类,派生出一个具有特定元数据(成员、布局乃至隐含的二进制符号等等)类作为结果。 多继承在这里仅仅是明确允许输入的类能超过两个而已,没什么特别的含义。
C++用的是这种构造方式来提供类类型。一些其它的语言设计为了支持这类所谓的面向对象编程就直接支持了所谓接口等本质上更加复杂的特殊特性,实际上只是掩盖了语言设计抽象能力不足而已。有的语言设计者偏执地认为超过一个基类的设计不够面向对象或者会经常造成实现困难而直接越俎代庖替用户决定不支持多继承,乃至连混入(mixin)这种基础用法都要搞成什么模式,对此只是更加容易让有脑子的用户呵呵而已。
2017年12月14日 15点12分
11