zoukankan      html  css  js  c++  java
  • Scala trait 线性推导

    代码

    
    class A{
      def m(s:String) = println(s"A($s)")
    }
    
    trait B extends A{
      override def m(s:String) = super.m(s"B($s)")
    }
    trait C extends A{
      override def m(s:String) = super.m(s"C($s)")
    }
    trait D extends A{
      override def m(s:String) = super.m(s"D($s)")
    }
    trait E extends C{
      override def m(s:String) = super.m(s"E($s)")
    }
    trait F extends C{
      override def m(s:String) = super.m(s"F($s)")
    }
    class G extends D with E with F with B{
       override def m(s:String) = super.m(s"G($s)")
    }
    
    val x = new G
    x.m("")

    类图

    class

    第一种推导方式

    1. 从右往左,选择离G最远的trait,将该tiait从自身到父类从左往右放置
    2. 将此时线性化的结果中重复值去掉,原则是多个元素保留最右
    3. 在最右加入AnyRef和Any,完成构建
    step结果
    1 G B A
    2 G B A F C A
    3 G B A F C A E C A
    4 G B A F C A E C A D A
    5 G B F C E C D A
    6 G B F E C D A
    7 G B F E C D A AnyRef Any

    所以输出应该是:

    A(D(C(E(F(B(G()))))))

    第二种推导方式

    1. 从左往右,选择离G的trait最近的进行放置在左边,他的父类放在右边
    2. 依次将剩下的trait的也从左边开始放置,如果其父类已经出现在右边,则跳过
    3. 在最右加入AnyRef和Any,完成构建
    step结果
    1 G D A
    2 G E C D A
    3 G F E C D A
    4 G B F E C D A
    5 G B F E C D A AnyRef Any

    所以输出应该是:

    A(D(C(E(F(B(G()))))))
  • 相关阅读:
    常见逻辑谬误
    4 WPF依赖属性
    11 WPF样式和行为
    17 WPF控件模板
    3 WPF布局
    4.6.3 The LRParsing Algorithm
    4.6 Introduction to LR Parsing: Simple LR
    19 WPF 数据绑定
    分布式系统部署、监控与进程管理的几重境界
    运维知识体系
  • 原文地址:https://www.cnblogs.com/unsigned-error/p/7519182.html
Copyright © 2011-2022 走看看