日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

快学Scala习题解答—第十章 特质

發布時間:2025/4/9 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 快学Scala习题解答—第十章 特质 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
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习题解答—第十章 特质的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。