W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
在設(shè)計(jì)繪圖程序庫(kù)時(shí)常常需要定義一些具有矩形形狀的類型:比如窗口,bitmap 圖像,矩形選取框等。為了方便使用這些矩形對(duì)象,函數(shù)庫(kù)對(duì)象類提供了查詢對(duì)象寬度和長(zhǎng)度的方法(比如 width,height)和坐標(biāo)的 left,right,top 和 bottom 等方法。然而在實(shí)現(xiàn)這些函數(shù)庫(kù)的這樣方法,如果使用 Java 來(lái)實(shí)現(xiàn),需要重復(fù)大量代碼,工作量比較大(這些類之間不一定可以定義繼承關(guān)系)。但如果使用 Scala 來(lái)實(shí)現(xiàn)這個(gè)圖形庫(kù),那么可以使用 Trait,為這些類方便的添加和矩形相關(guān)的方法。
首先我們先看看如果使用不使用 Trait 如何來(lái)實(shí)現(xiàn)這些類,首先我們定義一些基本的幾何圖形類如 Point 和Rectangle:
class Point(val x:Int, val y:Int)
class Rectangle(val topLeft:Point, val bottomRight:Point){
def left =topLeft.x
def right =bottomRight.x
def width=right-left
// and many more geometric methods
}
這里我們定義一個(gè)點(diǎn)和矩形類,Rectangle 類的主構(gòu)造函數(shù)使用左上角和右下角坐標(biāo),然后定義了 left,right,和 width 一些常用的矩形相關(guān)的方法。
同時(shí),函數(shù)庫(kù)我們可能還定義了一下 UI 組件(它并不是使用 Retangle 作為基類),其可能的定義如下:
abstract class Component {
def topLeft :Point
def bottomRight:Point
def left =topLeft.x
def right =bottomRight.x
def width=right-left
// and many more geometric methods
}
可以看到 left,right,width 定義和 Rectangle 的定義重復(fù)??赡芎瘮?shù)庫(kù)還會(huì)定義其它一些類,也可能重復(fù)這些定義。
如果我們使用 Trait,就可以消除這些重復(fù)代碼,比如我們可以定義如下的 Rectangular Trait 類型:
trait Rectangular {
def topLeft:Point
def bottomRight:Point
def left =topLeft.x
def right =bottomRight.x
def width=right-left
// and many more geometric methods
}
然后我們修改 Component 類定義使其“融入”Rectangular 特性:
abstract class Component extends Rectangular{
//other methods
}
同樣我們也修改 Rectangle 定義:
class Rectangle(val topLeft:Point, val bottomRight:Point) extends Rectangular{
// other methods
}
這樣我們就把矩形相關(guān)的一些屬性和方法抽象出來(lái),定義在 Trait 中,凡是“混合”了這個(gè) Rectangluar 特性的類自動(dòng)包含了這些方法:
object TestConsole extends App{
val rect=new Rectangle(new Point(1,1),new Point(10,10))
println (rect.left)
println(rect.right)
println(rect.width)
}
運(yùn)行結(jié)果如下:
1
10
9
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: