文档章节

Scala 学习笔记(8)

 大胖和二胖
发布于 2016/08/12 17:16
字数 649
阅读 53
收藏 0

一、trait

trait Logger {
  def log(msg: String)
}

class ConsoleLogger extends Logger with Serializable{
  def log(msg: String) {println(msg)}
}

注意,没有implements,用extends就好了,另外,这里其实也是override,但是不需要写上。log在Logger当中是抽象的,如果要实现多个trait,用with连上就行了。另外,跟java一样,一个父类+若干个Interface

二、有具体实现的特质

trait Logger {
  def log(msg: String) {println(msg)}
}

class Account(val name: String, val password: String) extends Logger {
  def check() = {log("Account = " + name + " and password = " + password); name == "bajie" && password == "change" }
}

object Account {
  def main(args: Array[String]) {
    val acc = new Account("bajie", "change")
    acc.check
  }
}

前一节当中,对trait的使用,类似于java的interface。那么本节当中,它该怎么理解?

三、带有trait的对象

trait Logger {
  def log(msg: String) {}
}

trait ConsoleLogger extends Logger {
  override def log(msg: String) {println(msg)}
}

class Account(val name: String, val password: String) extends Logger {
  def check() = {log("Account = " + name + " and password = " + password); name == "bajie" && password == "change" }
}

object Account {
  def main(args: Array[String]) {
    val acc = new Account("bajie", "change")
    acc.check
    
    val acc1 = new Account("bajie", "change") with ConsoleLogger
    acc1.check
  }
}

又做了一些修改, Logger.log有一个空实现, ConsoleLogger.log干了活了, Account 混合了 Logger ,所以 acc.check ,并不做输出的工作,而 val acc1 = new Account("bajie", "change") with ConsoleLogger ,acc1.check有输出了。

好吧,目前我还想不清楚这样的一种设计,具体应该用来完成什么样的工作,但是它一定是有用的,尽量记住它吧。

四、特质的叠加(屌爆了)

trait Logger {
  def getLog: String = "I am the root; "
}

trait ConsoleLogger extends Logger {
  override def getLog = super.getLog + "Something happend "
}

trait TimeLogger extends Logger{
  override def getLog = super.getLog + "at " + new Date() + " "
}

class Account(val name: String, val password: String) extends Logger {
  def check() = {println(getLog); name == "bajie" && password == "change" }
}

object Account {
  def main(args: Array[String]) {   
    val acc1 = new Account("bajie", "change") with TimeLogger with ConsoleLogger
    acc1.check
    
    val acc2 = new Account("bajie", "change") with ConsoleLogger with TimeLogger
    acc2.check
  }
}

最后是输出

I am the root;
I am the root; at Fri Aug 12 01:32:24 PDT 2016 Something happend
I am the root; Something happend at Fri Aug 12 01:32:24 PDT 2016

体会一下吧,说不清楚了!

五、interface + abstract class

trait Logger {
  def log(message: String)
  def info(message: String) {println(message)}

}

class Account extends Logger {
  var accName = "bajie"
  var accPass = "change"
  def check() = {info("a user login "); accName == "bajie" && accPass == "change"}

  def log(message: String) { println(message) }
}

在这里Logger,既是一个interface,又是一个abstract class。Account可以直接使用info方法,又必须自己实现log方法。

六、具体属性和抽象属性

trait Logger {
  def log(message: String)
  def info(message: String) {println(message)}
 
  val logLevel: Int
  val maxlength = 20

}

class Account extends Logger {
  var accName = "bajie"
  var accPass = "change"
  def check() = {info("a user login "); accName == "bajie" && accPass == "change"}

  def log(message: String) { println(message) }
 
  val logLevel = 3
}

和前面一节类似,属性也有具体和抽象之分,具体字段可以再Account当中直接使用,抽象字段必须具体化。

© 著作权归作者所有

粉丝 23
博文 69
码字总数 50842
作品 0
沈阳
架构师
私信 提问
Scala学习笔记-基础语法

Scala学习笔记-基础语法 OneCoder2016-09-2046 阅读 Scala 上手学习Scala语言。先熟悉一下语法。对于Scala笔者也是完全的新手,对scala的设计思想和实现原理没有太多了解。错误在所难免,还望...

OneCoder
2016/09/20
0
0
Scala 学习笔记 模式匹配

1. 模式匹配简介 模式匹配是 Scala 的重要特性之一,前面两篇笔记Scala学习笔记(六) Scala的偏函数和偏应用函数、Scala学习笔记(七) Sealed Class 和 Enumeration都是为了这一篇而铺垫准备的...

Tony沈哲
2017/05/16
0
0
scala学习笔记

1.lazy 惰性计算 惰性 求值 特别用于 函数式编程语言 中。在使用延迟求值的时候,表达式不在它被绑定到变量之后就立即求值,而是在该值被取用的时候求值 。 除可以得到性能的提升外,惰性计算...

cjun1990
2015/09/10
124
0
Scala学习笔记 - 函数

Scala学习笔记 - 函数 OneCoder2016-09-2157 阅读 Scala Scala做为支持函数式编程的语言,函数自然是其核心的特性,因此笔者对函数部分的学习自然会更加认真细致一些。但也仅仅是基础部分。 ...

OneCoder
2016/09/21
0
0
Spark 学习资源收集

(一)spark 相关安装部署、开发环境 1、Spark 伪分布式 & 全分布式 安装指南 http://my.oschina.net/leejun2005/blog/394928 2、Apache Spark探秘:三种分布式部署方式比较 http://dongxic...

openthings
2016/05/29
201
0

没有更多内容

加载失败,请刷新页面

加载更多

代理模式之JDK动态代理 — “JDK Dynamic Proxy“

动态代理的原理是什么? 所谓的动态代理,他是一个代理机制,代理机制可以看作是对调用目标的一个包装,这样我们对目标代码的调用不是直接发生的,而是通过代理完成,通过代理可以有效的让调...

code-ortaerc
今天
5
0
学习记录(day05-标签操作、属性绑定、语句控制、数据绑定、事件绑定、案例用户登录)

[TOC] 1.1.1标签操作v-text&v-html v-text:会把data中绑定的数据值原样输出。 v-html:会把data中值输出,且会自动解析html代码 <!--可以将指定的内容显示到标签体中--><标签 v-text=""></......

庭前云落
今天
8
0
VMware vSphere的两种RDM磁盘

在VMware vSphere vCenter中创建虚拟机时,可以添加一种叫RDM的磁盘。 RDM - Raw Device Mapping,原始设备映射,那么,RDM磁盘是不是就可以称作为“原始设备映射磁盘”呢?这也是一种可以热...

大别阿郎
今天
12
0
【AngularJS学习笔记】02 小杂烩及学习总结

本文转载于:专业的前端网站☞【AngularJS学习笔记】02 小杂烩及学习总结 表格示例 <div ng-app="myApp" ng-controller="customersCtrl"> <table> <tr ng-repeat="x in names | orderBy ......

前端老手
昨天
16
0
Linux 内核的五大创新

在科技行业,创新这个词几乎和革命一样到处泛滥,所以很难将那些夸张的东西与真正令人振奋的东西区分开来。Linux内核被称为创新,但它又被称为现代计算中最大的奇迹,一个微观世界中的庞然大...

阮鹏
昨天
20
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部