groovy探索之運算子的過載
二
前一篇詳細的說了說算術運算子和關係運算子的過載,這篇要說說賦值運算子和取值運算子,即「
.」運算子的過載。
還是以前一篇的
yuan
類來作為例子。
classyuan
}
有了上面的類的定義,我們就可以如下使用這個類:
defy =newyuan()
y.num =
109
printlny.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 109printlny....
運算子過載之過載型別運算子
普通型別 類型別 呼叫對應的只有乙個引數 引數的型別就是這個普通型別 的建構函式 需求 boy boy1 10000 薪資 建構函式boy int boy boy2 rock 姓名 建構函式boy char 普通型別賦值給類型別其實很簡單,就是專門的對這個賦值的型別定義乙個建構函式。編譯器在執行 的...