10 特质

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

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

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

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

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

  1. import java.awt.geom.Ellipse2D
  2.  
  3. trait RectangleLike{
  4. this:Ellipse2D.Double=>
  5. def translate(x:Double,y:Double){
  6. this.x = x
  7. this.y = y
  8. }
  9. def grow(x:Double,y:Double){
  10. this.x += x
  11. this.y += y
  12. }
  13. }

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

  1. import java.awt.Point
  2.  
  3. class OrderedPoint extends Point with Ordered[Point]{
  4. def compare(that: Point): Int = if (this.x <= that.x && this.y < that.y) -1
  5. else if(this.x == that.x && this.y == that.y) 0
  6. else 1
  7. }

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

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



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

  1. trait Logger{
  2. def log(str:String,key:Int = 3):String
  3. }
  4.  
  5. class CryptoLogger extends Logger{
  6.  
  7. def log(str: String, key:Int): String = {
  8. for ( i <- str) yield if (key >= 0) (97 + ((i - 97 + key)%26)).toChar else (97 + ((i - 97 + 26 + key)%26)).toChar
  9. }
  10. }
  11.  
  12. object Test extends App{
  13. val plain = "chenzhen";
  14. println("明文为:" + plain);
  15. println("加密后为:" + new CryptoLogger().log(plain));
  16. println("加密后为:" + new CryptoLogger().log(plain,-3));
  17. }

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

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

  1. import java.awt.Point
  2. import java.beans.PropertyChangeSupport
  3.  
  4. trait PropertyChange extends PropertyChangeSupport
  5.  
  6. val 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特质的教程,用的都是些"在叫的狗"啦,"讲哲学的青蛙"啦之类的傻乎乎的样例。

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

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

  1. trait Fly{
  2. def fly(){
  3. println("flying")
  4. }
  5.  
  6. def flywithnowing()
  7. }
  8.  
  9. trait Walk{
  10. def walk(){
  11. println("walk")
  12. }
  13. }
  14.  
  15. class Bird{
  16. var name:String = _
  17. }
  18.  
  19. class BlueBird extends Bird with Fly with Walk{
  20. def flywithnowing() {
  21. println("BlueBird flywithnowing")
  22. }
  23. }
  24.  
  25. object Test extends App{
  26. val b = new BlueBird()
  27. b.walk()
  28. b.flywithnowing()
  29. b.fly()
  30. }

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

用特质来又一次实现缓冲。简单起见。重写read方法

兴许JavaIO具体讨论

10.9 使用本章的日志生成器特质,给前一个练习中的方案添加日志功能,要求体现缓冲的效果



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

  1. import java.io.InputStream
  2.  
  3. class IterableInputStream extends InputStream with Iterable[Byte]{
  4. def read(): Int = 0
  5.  
  6. def iterator: Iterator[Byte] = null
  7. }

快学Scala习题解答—第十章 特质的更多相关文章

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

    1 简介 近期对Scala比较感兴趣,买了本<快学Scala>,感觉不错.比<Programming Scala:Tackle Multi-Core Complexity on th ...

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

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

  3. 快学scala习题解答--第五章 类

    5 类  5.1 改进5.1节的Counter类,让它不要在Int.MaxValue时变成负数 class Count{ private var value = Int.MaxValue else v ...

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

    3 数组相关操作  3.1 编写一段代码.将a设置为一个n个随机整数的数组,要求随机数介于0(包括)和n(不包括)之间  random和yield的使用 import scala.math.rando ...

  5. 快学Scala 第十九课 (trait的abstract override使用)

    trait的abstract override使用: 当我看到abstract override介绍的时候也是一脸懵逼,因为快学scala,只介绍了因为TimestampLogger中调用的super ...

  6. 《快学Scala》

    Robert Peng's Blog - https://mr-dai.github.io/ <快学Scala>Intro与第1章 - https://mr-dai.github.io/S ...

  7. Coursera公开课Functional Programming Principles in Scala习题解答:Week 2

    引言 OK.时间非常快又过去了一周.第一周有五一假期所以感觉时间绰绰有余,这周中间没有假期仅仅能靠晚上加周末的时间来消化,事实上还是有点紧张呢! 后来发现每堂课的视频还有相应的课件(Slide).字幕 ...

  8. 快学Scala之特质

    一个Scala类可以继承多个特质(trait), 特质可能会要求使用它们的类支持某个特定特性, 与Java接口不同, Scala特质可以给出这些特质的缺省实现. 要点如下: Scala中类只能继承一个 ...

  9. [Scala] 快学Scala A2L2

    集合 13.1 集合的三大类 所有的集合都扩展Iterable特质.集合的三大集合为Seq, Set, Map Seq是一个有先后次序的值的序列,比如数组或列表.IndexSeq允许我们通过整型下表快 ...

随机推荐

  1. POJ_1083_(思维)

    Moving Tables Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 31511   Accepted: 10528 D ...

  2. UI开发模式-容器模式

    UI开发模式-容器模式 通用容器: 配置容器.

  3. spring思想分析

    摘要: EveryBody in the world should learn how to program a computer...because it teaches you how to th ...

  4. CodeFrist基础_Fluent Api

    一丶首先新建两个实体类 public class Student { public int StudentKey { get; set; } public string StudentName { g ...

  5. TWaver3D特效系列之环境映射

    随着TWaver3D的快速发展,越来越多的各种功能都在不断加强,包括性能的极大提升(可以参考这里),3D编辑器的易用性和功能持续增强(欢迎大家申请试用),各种特效的增加,特效是本文的主角. 对于UI技 ...

  6. Gym - 101670F Shooting Gallery(CTU Open Contest 2017 区间dp)

    题目&题意:(有点难读...) 给出一个数字序列,找出一个区间,当删除这个区间中的两个相同的数字后,只保留这两个数字之间的序列,然后继续删除相同的数字,问最多可以实行多少次删除操作. 例如: ...

  7. RequestMapping_PathVariable注解

    [@PathVariable 映射URL绑定的占位符] 1.带占位符的URL是Spring 3.0 新增的功能,该功能在Spring MVC向 REST 目标挺进发展过程中具有里程碑的意义. 2.通过 ...

  8. Spring MVC学习总结(10)——Spring MVC使用Cors跨域

    跨站 HTTP 请求(Cross-site HTTP request)是指发起请求的资源所在域不同于该请求所指向资源所在的域的 HTTP 请求.比如说,域名A(http://domaina.examp ...

  9. 闸门机制(Gate Mechanism)

    本系列文章由 @yhl_leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/51728107 神经网络中常说的闸门机制 ...

  10. validate针对checkbox、radio、select标签的验证

    jQuery.validate 是jquery的一个插件,用来辅助开发者在客户端方便快捷的实现表单验证,最终达到提高用户体验的目的. 示例代码 <form id="formLogin& ...