Scala Trait 示例–Rectangular 對(duì)象

2018-09-28 18:18 更新

Trait 示例–Rectangular 對(duì)象

在設(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
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)