risc-v中文社区

 找回密码
 立即注册
查看: 947|回复: 0

[原创] risc-v开发基础 Scala 特质之间的层次---(16)

[复制链接]

347

主题

564

帖子

2237

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2237
发表于 2021-8-5 14:57:19 | 显示全部楼层 |阅读模式
特质trait也可以继承自其它类,或混入任意多个特质trait,从父子关系上来说也叫子特质。
一个特质如果没有继承或混入,那么这个特质就是AnyRef类的子特质(scala中AnyRef类是所有非值类
和特质的超类)。一个类/object/特质,都是由extends引入的类或特质所决定的。
还要搞清楚一个概念,trait对混入有一个限制条件:要混入该特质的class/object/trait,它的超类必须是
待混入特质的超类,或者说它的超类必须是待混入特质的超类的子类,如果没有这样的规定,那么就可以说
scala是多继承的了,显然是不符合scala语法规则的。

class E
class F extends E
class G
trait H extends E   // H特质的超类是E
trait J extends F   // J特质的超类是F,但F是E的子类
//class K extends G with H with J  //错误 超类G不是超类E的子类(E是H特质的超类)

如果换成如下代码:
class E
class F extends E
class G
trait H extends E   // H特质的超类是E
trait J extends F   // J特质的超类是F,但F是E的子类
trait L extends G
//class M extends E with J  //错误 超类E不是特质J的超类F的子类
如果将上面extends E换成F的子类?
class E
class F extends E
class G
trait H extends E   // H特质的超类是E
trait J extends F   // J特质的超类是F,但F是E的子类
trait L extends G
class N extends F
class O extends N with J //实验成功
//所以:类O所extends和with的父类和特质中,必须要有共同的超类或超类的子类,从形式上来说,只要是这条继承链路上的涉及到的类,
// 必须是同一个类或其子类,类越后来定义则越extends更低层次的子类/孙子类,把握一个原则就是不能在整个链路上造成多继承类

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



Archiver|手机版|小黑屋|risc-v中文社区

GMT+8, 2024-5-3 21:37 , Processed in 0.017635 second(s), 17 queries .

risc-v中文社区论坛 官方网站

Copyright © 2018-2021, risc-v open source

快速回复 返回顶部 返回列表