快学Scala习题解答—第十章 特质
10.1 java.awt.Rectangle類有兩個非常實用的方法translate和grow,但可惜的是像java.awt.geom.Ellipse2D這種類沒有。
在Scala中,你能夠解決掉這個問題。定義一個RenctangleLike特質,增加詳細的translate和grow方法。
提供不論什么你須要用來實現的抽象方法,以便你能夠像例如以下代碼這樣混入該特質:
使用自身類型使得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作為密匙是的使用演示樣例
10.5 JavaBean規范里有一種提法叫做屬性變更監聽器(property change listener)。這是bean用來通知其屬性變更的標準方式。
PropertyChangeSupport類對于不論什么想要支持屬性變更通知其屬性變更監聽器的bean而言是個便捷的超類。但可惜已有其它超類的類—比方JComponent—必須又一次實現對應的方法。將PropertyChangeSupport又一次實現為一個特質,然后將它混入到java.awt.Point類中
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特質的教程,用的都是些"在叫的狗"啦,"講哲學的青蛙"啦之類的傻乎乎的樣例。
閱讀和理解這些機巧的繼承層級非常乏味且對于理解問題沒什么幫助,但自己設計一套繼承層級就不同了,會非常有啟示。
做一個你自己的關于特質的繼承層級,要求體現出疊加在一起的特質,詳細的和抽象的方法,以及詳細的和抽象的字段
10.8 在java.io類庫中。你能夠通過BufferedInputStream修飾器來給輸入流添加緩沖機制。
用特質來又一次實現緩沖。簡單起見。重寫read方法
興許JavaIO具體討論
10.9 使用本章的日志生成器特質,給前一個練習中的方案添加日志功能,要求體現緩沖的效果
10.10 實現一個IterableInputStream類,擴展java.io.InputStream并混入Iterable[Byte]特質
轉載于:https://www.cnblogs.com/lxjshuju/p/7114967.html
總結
以上是生活随笔為你收集整理的快学Scala习题解答—第十章 特质的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Mysql中字段类型之时间戳大坑
- 下一篇: 【bzoj4408】[Fjoi 2016