Scala練習(十)
8009 ワード
\1. java.awt.Rectangleクラスには2つの有用な方法translateとgrowがありますが、残念なことにjavaのようです.awt.geom.Ellipse 2 Dのようなクラスはありません.Scalaでは、この問題を解決することができます.RenctangleLike特質を定義し,具体的なtranslateとgrow法を加えた.次のコードのように特質を混入させるために、実装する必要がある抽象的な方法を提供します.
2.scalaをmath.Ordered[point]はjavaに混入する.awt.Pointの方式で、OrderedPointクラスを定義します.すなわち、x
3.BitSetクラスを表示し、そのすべてのスーパークラスと特質を1枚の図に描画します.タイプパラメータ([...]のすべての内容)は無視されます.次に、この特質の線形化規格の説明を与える.
略
4.ログメッセージをシーザーパスワードで暗号化するCryptoLoggerクラスを提供します.デフォルトではスプーンは3ですが、ユーザーは書き換えることもできます.デフォルトスプーンと-3をスプーンとして使用する例を示します.
5.JavaBean仕様には、beanが属性変更を通知するための標準的な方法である属性変更リスナー(property change listener)という言い方があります.PropertyChangeSupportクラスは、プロパティ変更通知のプロパティ変更リスナーをサポートしたいbeanにとって便利なスーパークラスです.しかし、残念ながらJComponentのような他のスーパークラスのクラスは、対応する方法を再実現する必要があります.PropertyChangeSupportを再び特質として実現しjavaに混入する.awt.ポイントクラス
1
2
3
val egg = new java.awt.geom.Ellipse2D.Double(5,10,20,30) with RectangleLike
egg.translate(10,-10)
egg.grow(10,20)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import java.awt.geom.Ellipse2D
trait RectangleLike {
this: Ellipse2D.Double =>
def translate(x: Double, y: Double) {
this.x = x
this.y = y
}
def grow(x: Double, y: Double) {
this.x += x
this.y += y
}
}
object EclipseTest extends App {
val egg = new java.awt.geom.Ellipse2D.Double(5,10,20,30) with RectangleLike
egg.translate(10,-10)
egg.grow(10,20)
println(egg.getX)
println(egg.getY)
}
2.scalaをmath.Ordered[point]はjavaに混入する.awt.Pointの方式で、OrderedPointクラスを定義します.すなわち、x
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class OrderedPoint(x : Int, y : Int) extends java.awt.Point(x, y) with scala.math.Ordered[OrderedPoint]
{
def compare(that : OrderedPoint) : Int = {
if (this.x == that.x && this.y == that.y) {
0
} else if ((this.x < that.x || this.x == that.x) && this.y < that.y) {
-1
} else {
1
}
}
}
object TestTrait extends App
{
val test = Array(new OrderedPoint(3, 4), new OrderedPoint(4, 5));
scala.util.Sorting.quickSort(test)
test.foreach((p : OrderedPoint) => {println(p)})
val p1 = new OrderedPoint(3, 4);
val p2 = new OrderedPoint(4, 5);
println(p2 > p1)
}
3.BitSetクラスを表示し、そのすべてのスーパークラスと特質を1枚の図に描画します.タイプパラメータ([...]のすべての内容)は無視されます.次に、この特質の線形化規格の説明を与える.
略
4.ログメッセージをシーザーパスワードで暗号化するCryptoLoggerクラスを提供します.デフォルトではスプーンは3ですが、ユーザーは書き換えることもできます.デフォルトスプーンと-3をスプーンとして使用する例を示します.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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 CryptoLoggerTest extends App {
val text = "nmred"
println(text)
println(new CryptoLogger().log(text))
println(new CryptoLogger().log(text, -3))
}
5.JavaBean仕様には、beanが属性変更を通知するための標準的な方法である属性変更リスナー(property change listener)という言い方があります.PropertyChangeSupportクラスは、プロパティ変更通知のプロパティ変更リスナーをサポートしたいbeanにとって便利なスーパークラスです.しかし、残念ながらJComponentのような他のスーパークラスのクラスは、対応する方法を再実現する必要があります.PropertyChangeSupportを再び特質として実現しjavaに混入する.awt.ポイントクラス
1
2
3
4
5
6
import java.awt.Point
import java.beans.PropertyChangeSupport
trait PropertyChange extends PropertyChangeSupport
val p = new Point() with PropertyChange