Scala 学习(8)之「trait (2) 」

trait调用链

  • Scala 中支持让类继承多个 trait 后,依次调用多个 trait 中的同一个方法,只要让多个 trait 的同一个方法中,在最后都执行super.方法即可
  • 类中调用多个 trait 中都有的这个方法时,首先会从最右边的 trait 的方法开始执行,然后依次往左执行,形成一个调用链条
  • 这种特性非常强大,其实就相当于设计模式中的责任链模式的一种具体实现依赖
trait Handler {
    def handle(data: String) {} //方法
}
trait DataValidHandler extends Handler {
    override def handle(data: String) {     //覆盖并实现父类的方法
        println("check data: " + data)
        super.handle(data)
    }
}
trait SignatureValidHandler extends Handler {
    override def handle(data: String) {     //覆盖并实现父类的方法
        println("check signature: " + data)
        super.handle(data)
    }
}
class Person(val name: String) extends SignatureValidHandler with DataValidHandler {
    def sayHello = { println("Hello, " + name); handle(name) }
}

val person = new Person("0mifang")
// Hello, 0mifang
// check data: 0mifang
// check signature: 0mifang
person.sayHello

在 trait 中覆盖抽象方法

覆盖时,如果使用了super.方法的代码,则无法通过编译。因为super.方法就会去调用父 trait 的抽象方法,此时子 trait 的该方法还是会被认为是抽象的,此时如果要通过编译,就得给子 trait 的方法加上 abstract override 修饰

trait Logger {
    def log(msg: String)
}
trait MyLogger extends Logger {
    abstract override def log(msg: String) { super.log(msg) }
}

混合使用 trait 的具体方法和抽象方法

  • 可以让具体方法依赖于抽象方法,而抽象方法则放到继承 trait 的类中去实现
  • 这种 trait 其实就是设计模式中的模板设计模式的体现
trait Valid {
    def getName: String //抽象方法
    def valid: Boolean = {  //检验输入名称的方法
        getName == "0mifang"
    }
}
class Person(val name: String) extends Valid {

。。。

扫码查看历史消息,可获得完整版文章

原文地址:https://www.cnblogs.com/Alex458/p/12293406.html

时间: 2024-10-07 07:00:52

Scala 学习(8)之「trait (2) 」的相关文章

scala学习笔记-面向对象编程之Trait(13)

将trait作为接口使用 1 // Scala中的Triat是一种特殊的概念 2 // 首先我们可以将Trait作为接口来使用,此时的Triat就与Java中的接口非常类似 3 // 在triat中可以定义抽象方法,就与抽象类中的抽象方法一样,只要不给出方法的具体实现即可 4 // 类可以使用extends关键字继承trait,注意,这里不是implement,而是extends,在scala中没有implement的概念,无论继承类还是trait,统一都是extends 5 // 类继承tra

scala学习手记31 - Trait

不知道大家对java的接口是如何理解的.在我刚接触到接口这个概念的时候,我将接口理解为一系列规则的集合,认为接口是对类的行为的规范.现在想来,将接口理解为是对类的规范多少有些偏颇,更恰当些的观点应该是:相对于类来说,接口是更深层次的抽象,虽然同时接口也起到了规定类的行为的作用. 和java的接口比起来,scala的Trait可能更具体一些.正如Trait的含义一样,它指的是一种特质,如果认为类有某种特质就混入对应的Trait好了.在scala中,类是对现实某一类事务的建模,而Trait则是对已有

Scala学习笔记-环境搭建以及简单语法

关于环境的搭建,去官网下载JDK8和Scala的IDE就可以了,Scala的IDE是基于Eclipse的. 下面直接上代码: 这是项目目录: A是scala写的: package first import scala.collection.mutable.ListBuffer object A { def main(args: Array[String]) { print("Hello,Scala");//学习程序设计的第一句 println("---");//pr

中国特色程序猿的「钱途」

今天在微博看到一篇文章,程序猿转型书商 年交易额千万元.作为一个合格的中国特色的码农.忍不住想写点儿什么. 程序猿的「钱途」在那里? 从出版业说起 网络作品排到靠前的,都不会太难看,一般人不爱看某部作品也是由于不喜欢这个类型,而此人也不会全不喜欢这些网络作品.究其原因,是由于网络作品都是让人先白看的,看的好了才出了头.而纸质作品就不一定了,排行榜靠前的,有好作品,也有垃圾. 很多大牛都是写了博客,后来出了书.这些书也都不次,可能有人让为不好,是由于技术书不像小说.小说在读故事,技术书是在学知识或

「豆瓣时间」

变着花样,「豆瓣时间」的广告页已经在豆瓣App上轮播了一周.豆瓣er们被雨果.普希金.菏尔德林等大师邀请了那么多天,终于在今天见到这档付费音频节目的真面目. 今天是2017年3月7日,距分答上线近一年,距喜马拉雅FM“123知识狂欢节”过去3个月.如今,罗胖正在炮制概念的路上狂奔,知乎已然形成付费矩阵,科技媒体Pro版遍地开花. 以文艺青年为主要用户群的豆瓣,却还是秉持“慢工出细活”的态度,除了原创+打赏的标配功能,去年最大的动作就是阿北宣布要进军影业.虽然每个行为都指向内容,但都没真正涉及支付

深度 | 邢波教授谈人工智能科学路径:为人工智能装上「无穷动」引擎

深度 | 邢波教授谈人工智能科学路径:为人工智能装上「无穷动」引擎 本文由邢波教授 授权转载 微信公众号:猫匣子 作者:邢波 有些人是因为对人工智能的原理不理解而导致,有些人是为了个人名望而宣扬人工智能威胁论,有些人则是为了商业的利益推动人工智能威胁论.——Yann LeCun   人工智能算法本身这个计算任务像登山,它是有明确的目标的,可以用数学描述和比较的目标,它本身有弹性.容错性.随机性.和客观的量化的可评估性 … 人工智能功能的提升和突破来源于理论模型,算法,和计算引擎的不断创新,缺一不

「知乎」上那些神回答

1.你收到的最雷的表白语是什么?做我女朋友行不行,行就行,不行我再想想办法.—— 知友:程冬冬 2.“晚来天欲雪,能饮一杯无”,怎么回复比较霸气?司机一行酒,亲人两行泪.—— 知友:鼓鼓 3.「滚床单」有哪些优雅的叫法?管鲍之交.—— 知友:匿名用户 4.为什么中国人这么喜欢拍古装片?科幻片面临的最大问题是,在未来时空还要不要党的领导?—— 知友:magasa 5.暧昧是什么?暧昧=爱日未日.—— 知友:苑小帅 6.女朋友和女性朋友有什么区别?中国人取名字有一个习惯:实际上缺什么,一定要在名字里

世界上最遥远的距离莫过于:「暑假前」和「暑假后」

相信很多人开学第一天的反应都是这样的:不过一个暑假,怎么一切都变得陌生了? 整个学院,焕然一新,清一色的白墙,换上了各种小清新的鹅黄.淡粉,俨然进入了「童话世界」: 校园里挂满了各种欢迎新生的创意横幅,「防火.防盗.防学长」之类的调侃,随处可见: 隔壁班那个心仪的男孩,依然「耀眼」,只是一个暑假后,他的身边俨然多了一个十指相扣的「她」: 就连同一寝室那些曾经最为亲近的人,也变得倍感「陌生」. 分分钟让人徒添一种感慨:世界上最遥远的距离莫过于:「暑假前」和「暑假后」. 人与人之间的差距,是从假期拉

「C语言」文件的概念与简单数据流的读写函数

写完「C语言」单链表/双向链表的建立/遍历/插入/删除 后,如何将内存中的链表信息及时的保存到文件中,又能够及时的从文件中读取出来进行处理,便需要用到”文件“的相关知识点进行文件的输入.输出. 其实,就算不懂得链表,也完全可以学习”文件“相关知识点,但在此之前最好有”指针“基础. 本篇文章整理自<C语言程序设计教程--人民邮电出版社>第十二章——文件,以作文件探讨. 一.数据流与文件概念 二.文件的打开与关闭 三.文件的顺序读写 四.文件的随机读写 一.数据流与文件概念 1.数据流 数据的输入