当前位置: 首页 > wzjs >正文

肇庆建站模板源码seo外链是什么

肇庆建站模板源码,seo外链是什么,杭州 城西 做网站,深圳网站建设deyond在 Scala 中,特质(Trait)是一种强大的工具,用于实现代码的复用和组合。当一个类混入(with)多个特质时,可能会出现方法冲突的情况。为了解决这种冲突,Scala 引入了最右优先原则&#…

在 Scala 中,特质(Trait)是一种强大的工具,用于实现代码的复用和组合。当一个类混入(with)多个特质时,可能会出现方法冲突的情况。为了解决这种冲突,Scala 引入了最右优先原则(Rightmost First Rule),也称为线性化规则(Linearization Rule)

最右优先原则

最右优先原则的核心思想是:在混入多个特质时,最右边的特质会优先生效。也就是说,如果一个方法在多个特质中都有定义,那么最右边的特质中的方法会覆盖左边特质中的方法。

示例1
trait A {def greet(): String = "Hello from A"
}trait B {def greet(): String = "Hello from B"
}class C extends A with B {override def greet(): String = super.greet()
}val obj = new C
println(obj.greet())  // 输出: Hello from B

在上面的例子中:

  • 类 C 混入了特质 A 和 B

  • 根据最右优先原则,B 中的 greet 方法会覆盖 A 中的 greet 方法。

  • 因此,调用 obj.greet() 时,输出的是 B 中的实现。

线性化规则

最右优先原则是 Scala 线性化规则的一部分。Scala 会为每个类生成一个线性化顺序(Linearization Order),这个顺序决定了方法调用的优先级。

线性化顺序的生成规则
  1. 类的线性化顺序从最具体的类开始,逐步向更通用的类扩展。

  2. 混入的特质按照从右到左的顺序排列。

  3. 每个特质只会在线性化顺序中出现一次。

示例2
trait A {def greet(): String = "Hello from A"
}trait B extends A {override def greet(): String = "Hello from B"
}trait C extends A {override def greet(): String = "Hello from C"
}class D extends B with C {override def greet(): String = super.greet()
}val obj = new D
println(obj.greet())  // 输出: Hello from C

在这个例子中:

  • 类 D 的线性化顺序是:D -> C -> B -> A

  • 根据最右优先原则,C 中的 greet 方法会覆盖 B 中的 greet 方法。

  • 因此,调用 obj.greet() 时,输出的是 C 中的实现。

super 的调用

在特质中,super 的调用是动态绑定的,它会根据线性化顺序调用下一个特质或类中的方法。

示例3
trait A {def greet(): String = "Hello from A"
}trait B extends A {override def greet(): String = s"${super.greet()} and Hello from B"
}trait C extends A {override def greet(): String = s"${super.greet()} and Hello from C"
}class D extends B with C {override def greet(): String = super.greet()
}val obj = new D
println(obj.greet())  // 输出: Hello from A and Hello from B and Hello from C

如果你还是有疑问,接下来,是更加具体的分析:
 

在示例3中,输出的是Hello from A and Hello from B and Hello from C,而不是 Hello from A and Hello from C and Hello from B。这看起来似乎与最右优先原则相矛盾,但实际上这是由 Scala 的线性化规则(Linearization Rule)决定的。

线性化规则详解

Scala 的线性化规则决定了方法调用的顺序。具体来说,当一个类混入多个特质时,Scala 会生成一个线性化顺序,这个顺序决定了 super 调用的行为。

线性化顺序的生成规则
  1. 从最具体的类开始,逐步向更通用的类扩展。

  2. 混入的特质按照从右到左的顺序排列

  3. 每个特质只会在线性化顺序中出现一次

在示例3中:

class D extends B with C
  • D 的线性化顺序是:D -> C -> B -> A

线性化顺序的解释
  1. D:最具体的类。

  2. C:因为 C 是最右边的特质,所以它排在 B 前面。

  3. BB 是左边的特质,排在 C 后面。

  4. AA 是 B 和 C 的共同父特质,排在最后。

因此,D 的线性化顺序是:D -> C -> B -> A

super 的调用行为

在 Scala 中,super 的调用是动态绑定的,它会根据线性化顺序调用下一个特质或类中的方法。

例子分析
trait A {def greet(): String = "Hello from A"
}trait B extends A {override def greet(): String = s"${super.greet()} and Hello from B"
}trait C extends A {override def greet(): String = s"${super.greet()} and Hello from C"
}class D extends B with C {override def greet(): String = super.greet()
}val obj = new D
println(obj.greet())  // 输出: Hello from A and Hello from B and Hello from C
  1. D 中的 greet 方法

    • 调用 super.greet(),根据线性化顺序,super 指向 C

  2. C 中的 greet 方法

    • 调用 super.greet(),根据线性化顺序,super 指向 B

  3. B 中的 greet 方法

    • 调用 super.greet(),根据线性化顺序,super 指向 A

  4. A 中的 greet 方法

    • 返回 "Hello from A"

  5. 方法调用的堆栈

    • A 返回 "Hello from A"

    • B 在其基础上追加 " and Hello from B",得到 "Hello from A and Hello from B"

    • C 在其基础上追加 " and Hello from C",得到 "Hello from A and Hello from B and Hello from C"

为什么不是 Hello from A and Hello from C and Hello from B

  • 因为 super 的调用是根据线性化顺序动态绑定的,而不是简单地按照最右优先原则直接覆盖。

  • 线性化顺序是 D -> C -> B -> A,所以 C 的 super 指向 BB 的 super 指向 A

  • 因此,C 的 greet 方法会先调用 B 的 greet 方法,而 B 的 greet 方法会调用 A 的 greet 方法。

总结

  • 最右优先原则:决定了特质的优先级,最右边的特质会优先生效。

  • 线性化规则:决定了 super 的调用顺序,super 会根据线性化顺序动态绑定到下一个特质或类。

  • 在示例3中,线性化顺序是 D -> C -> B -> A,因此输出的顺序是 Hello from A and Hello from B and Hello from C

在示例2中,为什么输出是 Hello from C,而不是 Hello from A and Hello from C?


代码分析

trait A {def greet(): String = "Hello from A"
}trait B extends A {override def greet(): String = "Hello from B"
}trait C extends A {override def greet(): String = "Hello from C"
}class D extends B with C {override def greet(): String = super.greet()
}val obj = new D
println(obj.greet())  // 输出: Hello from C
  1. 特质的继承关系

    • B 和 C 都继承自 A,并且都重写了 greet 方法。

    • D 混入了 B 和 C,并且重写了 greet 方法,调用了 super.greet()

  2. 线性化顺序

    • 当 D 混入 B 和 C 时,Scala 会生成一个线性化顺序。线性化顺序的规则是:

      • 从最具体的类开始,逐步向更通用的类扩展。

      • 混入的特质按照从右到左的顺序排列。

      • 每个特质只会在线性化顺序中出现一次。

    • 对于 class D extends B with C,线性化顺序是:D -> C -> B -> A

  3. super 的调用行为

    • 在 D 的 greet 方法中,super.greet() 会根据线性化顺序调用下一个特质或类中的 greet 方法。

    • 线性化顺序是 D -> C -> B -> A,因此 super.greet() 会调用 C 中的 greet 方法。

  4. C 中的 greet 方法

    • C 中的 greet 方法直接返回 "Hello from C"没有调用 super.greet()

    • 因此,C 的 greet 方法不会继续调用 B 或 A 的 greet 方法。


为什么输出是 Hello from C

  • 在 D 的 greet 方法中,super.greet() 调用的是 C 的 greet 方法。

  • C 的 greet 方法直接返回 "Hello from C",没有继续调用 super.greet()(即没有调用 B 或 A 的 greet 方法)。

  • 因此,最终的输出是 "Hello from C"


为什么不是 Hello from A and Hello from C

  • 如果希望输出 Hello from A and Hello from C需要在 C 的 greet 方法中显式调用 super.greet(),将 A 的行为与 C 的行为组合起来。

  • 例如:

trait C extends A {override def greet(): String = s"${super.greet()} and Hello from C"
}

修改后,C 的 greet 方法会先调用 A 的 greet 方法,然后追加 " and Hello from C"。此时,输出会是 Hello from A and Hello from C


修改后的代码

trait A {def greet(): String = "Hello from A"
}trait B extends A {override def greet(): String = "Hello from B"
}trait C extends A {override def greet(): String = s"${super.greet()} and Hello from C"
}class D extends B with C {override def greet(): String = super.greet()
}val obj = new D
println(obj.greet())  // 输出: Hello from A and Hello from C

总结

  • 默认行为:在 C 的 greet 方法中,如果没有调用 super.greet(),则只会执行 C 的逻辑,输出 Hello from C

  • 组合行为:如果希望将父特质的行为与当前特质的行为组合起来,需要在重写方法时显式调用 super.greet()

  • 线性化顺序super 的调用是根据线性化顺序动态绑定的,线性化顺序决定了方法调用的优先级。

http://www.dtcms.com/wzjs/23549.html

相关文章:

  • 飞扬世纪网站建设湖南百度推广开户
  • 网站备案 拍照网点seo工资水平
  • 拱墅区哪里有网站建设企业网络营销策划书范文
  • 做嗳嗳的网站网址域名
  • wordpress声明插件福建seo推广方案
  • 随州市住房和城乡建设委员会网站房产百度账号申请注册
  • 柳州学校网站建设一个好的产品怎么推广
  • 网站维护机构给大家科普一下b站推广网站
  • app网页制作教程seo点击工具
  • 四川省建设网站建筑电工百家号权重查询站长工具
  • 淘宝上买网站建设靠谱吗宁波seo优化费用
  • 云浮哪有做网站公司佛山seo
  • 网站怎么做404 301苏州网站建设制作公司
  • 源码怎样做网站如何引流推广产品
  • 正品查询网站怎么做凡科建站和华为云哪个好
  • 想做一个网站怎么做的做网站用什么软件好
  • 腾讯cdn加速wordpressseo推广教学
  • wordpress手机端显示seo的基本工作内容
  • 网站建设与建设谷歌优化排名哪家强
  • 宁国网站建设友链目录网
  • 在国内做推广产品用什么网站好如何制作一个个人网站
  • 宝宝投票网站怎么做的百度竞价推广代理商
  • 天河区门户网站官网seo专业知识培训
  • 美心西饼在哪个网站做问卷调查前端seo是什么
  • 做混剪素材网站网络营销企业网站
  • 自己怎么做机构网站网站搭建费用
  • 做网站流程 优帮云今日足球赛事分析推荐
  • 广州门户网站开发哪有恶意点击软件买的
  • 深圳企业网站建设费用明细个人网站规划书模板
  • 学手机网站建设网站建设公司哪家好?该如何选择