groovy探索之運算子的過載 二
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
前一篇詳細的說了說算術運算子和關係運算子的過載,這篇要說說賦值運算子和取值運算子,即「.」運算子的過載。
還是以前一篇的yuan類來作為例子。
classyuan
}有了上面的類的定義,我們就可以如下使用這個類:
defy =newyuan()
y.num =
109printlny.tostring()
其中,「y.num =
109」就是乙個賦值語句,關鍵的運算子就是「.」;當然,我們還可以用該運算子進行取值運算,如下:
printlny.num
我們今天要說的就是對「.」運算子的過載。當然,只要我們稍微一想,就可以知道,該運算子應該和「set」和「get」方法有關。不錯,的確如此。
下面,我們來看看如何過載「.」運算子。
classyuan
deftostring()
}要過載取值運算,當然只要「get」方法就行了,注意看**中的「getowner()」方法,實現了它,我們就可以寫出「y.owner」這樣的**來。
下面來看我們的測試**:
defy =newyuan(num:
100)
y.owner
println
" has $ yuan."
執行結果為:
tom has 100 yuan.
當然,過載賦值運算就和「set」方法相關了,如下:
classyuan
deftostring()
}測試**如下:
defy =newyuan(num:
100)
y.owner =
'mike'
可以看到,「.」運算子的過載跟其他運算子的過載也都一樣,沒有什麼特別的地方。但為什麼要把它拿出來單獨成一篇呢?這是因為它跟dsl有很大關係,是groovy語言實現dsl的一種方式。
下面就來說一說如何使用「.」運算子來實現dsl的。
一直以來,我們都希望計算機能夠識別我們人類的自然語言,如它能夠幫我們計算這樣的題目:
12元+39毛+123分
當然,現在的計算機還不能做到這樣的場景。但是,現在有了dsl,我們能做到這樣的場景:
12.yuan+39.jiao+123.fen
這樣,就相當的接近我們的自然語言了。那麼,groovy語言是怎麼實現上面的場景的呢?
一看到「12.yuan」這樣的表示式,我們就可以想到,這不就是乙個取值運算嗎?我們可以過載「.」運算子。
不錯,groovy語言正是通過過載「.」運算子幫我們實現上面的場景的。既然要過載「.」運算子,那麼「12」又是乙個什麼物件呢?在groovy語言中一切都是物件,「12」是乙個integer物件。
對啦,我們只需要在integer類裡實現getyuan()方法,就可以過載取值運算子。但integer類是乙個已經存在的類,我們不能直接修改它。
那麼我們怎麼給integer類新增getyuan()方法呢?是的,通過metaclass,即元物件。
下面是實現上面的場景的**:
defmc =newexpandometaclass(integer.class,true)
mc.getyuan <<
mc.getjiao <<
mc.getfen <<
mc.initialize()
首先取得integer類的元物件:「defmc =newexpandometaclass(integer.class,true)」。
然後,再新增各個「get」方法,因為我們只需要實現取值運算,因此,只需要實現「get」方法就可以了。
最後例項化這個元物件,即「mc.initialize()」
現在,我們來測試這段**:
println
12.yuan+
45.jiao+
33.fen
結果為:
16.83
運算子的過載是groovy語言實現dsl的乙個很重要的方面,因此,我們拿出兩個章節才把它說完,希望我們在今後的編碼實踐中經常的使用到它。
Groovy探索之運算子的過載 一
groovy探索之運算子的過載 一 運算子最常用的是算術運算子和關係運算子。groovy語言對這些常用的運算子的過載提供了很好的支援。比如過載加號的方法是 plus 我們只要在我們自己的類中實現了該方法,就能使用加號對物件進行相加運算。下面舉個例子。比如,我們有乙個類yuan,用來模擬我們的人民幣元...
Groovy探索之運算子的過載 二
groovy探索之運算子的過載 二 前一篇詳細的說了說算術運算子和關係運算子的過載,這篇要說說賦值運算子和取值運算子,即 運算子的過載。還是以前一篇的 yuan 類來作為例子。classyuan 有了上面的類的定義,我們就可以如下使用這個類 defy newyuan y.num 109 printl...
運算子過載之過載型別運算子
普通型別 類型別 呼叫對應的只有乙個引數 引數的型別就是這個普通型別 的建構函式 需求 boy boy1 10000 薪資 建構函式boy int boy boy2 rock 姓名 建構函式boy char 普通型別賦值給類型別其實很簡單,就是專門的對這個賦值的型別定義乙個建構函式。編譯器在執行 的...