官术网_书友最值得收藏!

6.11 方法重載

回到Rational類。有了最新的這些變更以后,就可以用更自然的風格來對有理數進行加法和乘法運算。不過我們還缺少混合運算。比如,不能用一個有理數乘以一個整數,因為*的操作元必須都是Rational對象。因此對于一個有理數r,不能寫成r * 2,而必須寫成r * new Rational(2),這并不是理想的效果。

為了讓Rational類用起來更方便,我們將添加兩個新的方法來對有理數和整數進行加法和乘法運算。同時,我們還會順便加上減法和除法運算。調整后的結果請看示例6.5。

現在每個算術方法都有兩個版本:一個接收有理數作為參數;另一個則接收整數作為參數。換句話說,每個方法名都被重載了,因為每個方法名都被用于多個方法。舉例來說,+這個方法名被同時用于一個接收Rational參數的方法和另一個接收Int參數的方法。在處理方法調用時,編譯器會選取重載方法中正確匹配了入參類型的版本。例如,如果x.+(y)中的y是有理數,編譯器就會選擇接收Rational參數的+方法。但如果入參是整數,編譯器就會選擇接收Int參數的那個方法。如果你嘗試下面這段代碼:

示例6.5 帶有重載方法的Rational

你將會看到,被調用的*方法具體是哪一個取決于右操作元的類型。

注意

Scala解析重載方法的過程與Java很像。在每個具體的案例中,被選中的是那個最匹配入參靜態類型的重載版本。有時候并沒有一個唯一的最佳匹配版本,遇到這種情況編譯器會提示“ambiguous reference”(模糊引用)錯誤。

主站蜘蛛池模板: 灵台县| 烟台市| 泽州县| 桃园县| 房产| 抚顺市| 略阳县| 瑞安市| 铁岭市| 城口县| 衡山县| 丰台区| 太谷县| 雷山县| 绵阳市| 平度市| 泗阳县| 白沙| 东乌珠穆沁旗| 呈贡县| 北流市| 嘉祥县| 习水县| 桂东县| 化州市| 彰化县| 深州市| 德钦县| 大足县| 罗甸县| 昌宁县| 大荔县| 兴业县| 海原县| 沭阳县| 博罗县| 新密市| 忻城县| 舒兰市| 剑河县| 申扎县|