10 特质
10.1 java.awt.Rectangle类有两个非常实用的方法translate和grow,但可惜的是像java.awt.geom.Ellipse2D这种类没有。

在Scala中,你能够解决掉这个问题。定义一个RenctangleLike特质,增加详细的translate和grow方法。

提供不论什么你须要用来实现的抽象方法,以便你能够像例如以下代码这样混入该特质:

val egg = new java.awt.geom.Ellipse2D.Double(5,10,20,30) with RectangleLike
egg.translate(10,-10)
egg.grow(10,20)

使用自身类型使得trait能够操作x,y

import java.awt.geom.Ellipse2Dtrait RectangleLike{this:Ellipse2D.Double=>def translate(x:Double,y:Double){this.x = xthis.y = y}def grow(x:Double,y:Double){this.x += xthis.y += y}
}

10.2 通过把scala.math.Ordered[Point]混入java.awt.Point的方式。定义OrderedPoint类。按辞典编辑方式排序。也就是说,假设x<x'或者x=x'且y<y'则(x,y)<(x',y')

import java.awt.Pointclass OrderedPoint extends Point with Ordered[Point]{def compare(that: Point): Int = if (this.x <= that.x && this.y < that.y) -1 else if(this.x == that.x && this.y == that.y) 0 else 1
}

10.3 查看BitSet类,将它的全部超类和特质绘制成一张图。忽略类型參数([…]中的全部内容)。

然后给出该特质的线性化规格说明

10.4 提供一个CryptoLogger类。将日志消息以凯撒password加密。缺省情况下密匙为3,只是使用者也能够重写它。提供缺省密匙和-3作为密匙是的使用演示样例

trait Logger{def log(str:String,key:Int = 3):String
}class CryptoLogger extends Logger{def log(str: String, key:Int): String = {for ( i <- str) yield if (key >= 0) (97 + ((i - 97 + key)%26)).toChar else (97 + ((i - 97 + 26 + key)%26)).toChar}
}object Test extends App{val plain = "chenzhen";println("明文为:" + plain);println("加密后为:" + new CryptoLogger().log(plain));println("加密后为:" + new CryptoLogger().log(plain,-3));
}

10.5 JavaBean规范里有一种提法叫做属性变更监听器(property change listener)。这是bean用来通知其属性变更的标准方式。

PropertyChangeSupport类对于不论什么想要支持属性变更通知其属性变更监听器的bean而言是个便捷的超类。但可惜已有其它超类的类—比方JComponent—必须又一次实现对应的方法。将PropertyChangeSupport又一次实现为一个特质,然后将它混入到java.awt.Point类中

import java.awt.Point
import java.beans.PropertyChangeSupporttrait PropertyChange extends PropertyChangeSupportval p = new Point() with PropertyChange

10.6 在Java AWT类库中,我们有一个Container类。一个能够用于各种组件的Component子类。举例来说,Button是一个Component,但Panel是Container。这是一个运转中的组合模式。

Swing有JComponent和JContainer,但假设你细致看的话,你会发现一些奇怪的细节。虽然把其它组件加入到比方JButton中毫无意义,JComponent依旧扩展自Container。Swing的设计者们理想情况下应该会更倾向于图10-4中的设计。但在Java中那是不可能的。

请解释这是为什么?Scala中怎样用特质来设计出这种效果?
scala/01.jpg Java仅仅能单继承,JContainer不能同一时候继承自Container和JComponent。

Scala能够通过特质解决问题.
10.7 市面上有不下数十种关于Scala特质的教程,用的都是些"在叫的狗"啦,"讲哲学的青蛙"啦之类的傻乎乎的样例。

阅读和理解这些机巧的继承层级非常乏味且对于理解问题没什么帮助,但自己设计一套继承层级就不同了,会非常有启示。

做一个你自己的关于特质的继承层级,要求体现出叠加在一起的特质,详细的和抽象的方法,以及详细的和抽象的字段

trait Fly{def fly(){println("flying")}def flywithnowing()
}trait Walk{def walk(){println("walk")}
}class Bird{var name:String = _
}class BlueBird extends Bird with Fly with Walk{def flywithnowing() {println("BlueBird flywithnowing")}
}object Test extends App{val b = new BlueBird()b.walk()b.flywithnowing()b.fly()
}

10.8 在java.io类库中。你能够通过BufferedInputStream修饰器来给输入流添加缓冲机制。

用特质来又一次实现缓冲。简单起见。重写read方法
兴许JavaIO具体讨论
10.9 使用本章的日志生成器特质,给前一个练习中的方案添加日志功能,要求体现缓冲的效果

10.10 实现一个IterableInputStream类,扩展java.io.InputStream并混入Iterable[Byte]特质

import java.io.InputStreamclass IterableInputStream extends InputStream with Iterable[Byte]{def read(): Int = 0def iterator: Iterator[Byte] = null
}

转载于:https://www.cnblogs.com/lxjshuju/p/7114967.html

快学Scala习题解答—第十章 特质相关推荐

  1. 快学Scala习题解答—第一章 基础

    原文链接:http://blog.csdn.net/ivan_pig/article/details/8249768 ----------------------------------------- ...

  2. 快学Scala习题解答—第二章 控制结构和函数

    原文地址:http://blog.csdn.net/ivan_pig/article/details/8253068 ----------------------------------------- ...

  3. 快学Scala习题解答—第三章 数组相关操作

    原文链接:http://blog.csdn.net/ivan_pig/article/details/8257365 ----------------------------------------- ...

  4. 快学Scala习题解答—第四章 映射和元组

    4 映射和元组 4.1 设置一个映射,当中包括你想要的一些装备,以及它们的价格.然后构建还有一个映射.採用同一组键,可是价格上打9折  映射的简单操作 Shell代码   scala> val  ...

  5. Scala学习4之快学scala第六章习题之6.6花色枚举

    快学scala第六章习题之6.6花色枚举 6.6 编写一个扑克牌4种花色的枚举,让其toString方法分别返回♣,♦,♥,♠ 代码: </pre><pre name="c ...

  6. 快学Scala学习笔记及习题解答(5-8类、对象、包和继承)

    本文scala使用的版本是2.11.7 第五章 类 5.1 基本操作 class Person {// Scala会生成一个私有的final字段和一个getter方法,但没有setterval tim ...

  7. java字符串去掉一头一尾_快学Scala第13章----集合

    本章要点 所有集合都扩展自Iterable特质 集合有三大类:序列.集.映射 对于几乎所有集合类,Scala都同时提供了可变的和不可变的版本 Scala列表要么是空的,要么拥有一头一尾,其中尾部本身又 ...

  8. 快学Scala 学习笔记-1: (第一章到第三章)

    第一章. 1.1 Scala解释器(REPL) Scala> 8*5+2 res0: Int = 42 Scala> 0.5 * res0 res1: Double = 21.0 Scal ...

  9. 《快学Scala》第二章练习题答案+概述

    第二章 ***内容概述 if表达式也是有值的 val x = if(x>0) 1 else -1 块也有值-是它最后一个表达式 val value= {val x = 10 - 20val y ...

最新文章

  1. 实战|渗透学校某内网服务器
  2. python输入两个正整数m和n用for循环求其最大公约数_输入两个正整数,m和n,求其最大公约数和最小公倍数。...
  3. 预处理指令pragma常见用法集锦(#pragma once、#pragma comment和#pragma warning)
  4. JVM夺命连环10问
  5. Window中显示文件扩展名
  6. fastreport文本字数太多换行_Python教程第10篇:聊聊print换行输出和重复多次打印...
  7. 2021 前端面试经常被问到 Javascript+HTML5+CSS+ 框架问题(89 篇资料总结)
  8. 基于大数据架构实现景点游客数据分析平台,全国景点游客数据管理系统
  9. php网站模板怎么改动,ECshop网站模板修改详细教程 and 模板对应的文件
  10. 第一次带项目遇到的坑
  11. Flask Marshmallow基本使用
  12. 虎牙财报奏响游戏直播艰难进行曲
  13. 接口和继承知识点总结
  14. C语言HeapBottomUP算法,C语言堆的建立Percolate Up and Down
  15. 如何快速定位BUG?BUG定位技巧及测试人员定位的N板斧
  16. 无迹卡尔曼滤波UKF_代码及调参(2)
  17. 关于电阻的介绍,以及两线法和四线法测电阻的原理
  18. scrollTo不起作用
  19. 男人健康八年一个转折
  20. 最新版本交易猫钓鱼源码

热门文章

  1. 简单点亮发光二极管实例(位操作)
  2. STM32休眠后不能烧录程序
  3. 径向基函数(RBF)神经网络
  4. 简书显示服务器错误,openfire服务器异常处理
  5. python进制转化大全
  6. 卷机神经网络的可视化(可视化中间激活)
  7. 导入训练好的决策树文件_决策树在sklearn中的实现
  8. Python的进程和线程(二)——IO密集型任务
  9. 流媒体传输协议---RTP--基础
  10. 四、Java多人博客系统-2.0版本