• 东西常常不属于一个分类,java禁止多重继承
  • 问题
    • 多父类成员名冲突
      • 委托(delegation) # 聚合(aggregation),咨询(consultation), 不用多重继承,把原父类对象作为子类成员,后发展出依赖注入
      • 接口多重继承 # Java引入,php5(2004年)引入
      • 按顺序搜索
        • 深度优先 # python2.1, 菱形继承中,第一层父类的值会覆盖第二层右边父类的值
        • C3线性化 # 1996年提出,python2.3, perl6默认, 对类编号,子类先于父类检查, 优先检查先书写的类
        • 混入式处理(mix-in) # 扁平成新类, 该类不能创建实例,python XxxMixIn类, ruby类单一继承,模块混入
        • Trait # 2002年Trait论文,Squeak最早引入, scala, perl6的Roll, php5.4, ruby2.0的mix method
          • 类作用:创建实例(要求全面, 大的类),再利用单元(小的类)冲突
          • 把再利用单元特别化
            • ruby模块混入名称冲突时, 使用最后的模块, Trait会报错 # Smalltalk的Squeak处理器可取方法别名,可指定不参与冲突
            • scala声明创建实例需要的方法, 另一Trait声明提供的方法,组合匹配后可创建实例
            • 对Trait改写定义新的Trait(继承), Trait组合成新Trait