関数オブジェクトのメソッドの再ロード

1473 ワード

Rationalに戻ります.最近の変更後、有理数の加算と乗算には自然な表現方法があります.しかし、混合演算もあることを忘れないでください.たとえば、有理数と整数の間に乗算はできません.なぜなら、「*」のオペランドは現在有理数しかないからです.だから有理数rに対してr*2を書くことができなくて、ただ:r*new Rational(2)を書くことしかできなくて、これはとても美しくありません.Rationalをより使いやすくするために,有理数と整数の加算と乗算を実行できる新しい方法をクラスに追加することができる.次のようになります.
package scalaTest
class Rational(n:Int,d:Int) {
    require(d != 0)
    private val g = gcd(n.abs,d.abs)
    val number:Int = n/g
    val denon:Int = d/g
    def this(n:Int) = this(n,1)
    override def toString = number + "/" + denom
    def +(that:Rational):Rational = {
        new Rational(number * that.denom + that.number * d , d * that.denom)
    }
    //    
    def +(i:Int):Rational = new Rational(number + i * denom,denom)
    def *(that:Rational):Rational = {
        new Rational(number * that.number,denom * that.denom)
    }
    //    
    def *(i:Int):Rational = new Rational(number * i,denom)
    def lessThan(that:Rational) = {
        this.number * that.denom < that.number * this.denom
    }
    def max(that:Rational) = {
        if(this.lessThan(that)) that else this
    }
    private def gcd(a:Int,b:Int):Int = {
        if(b == 0) a else gcd(b,a % b)
    }
}

各数学方法には2つのバージョンがあります.1つは理数をパラメータとし、もう1つは整数です.あるいは、これらのメソッド名は、各名前が現在複数のメソッドで使用されているため、リロードされていると言える.メソッド呼び出し時に、コンパイラはパラメータタイプに正しく一致するリロードメソッドバージョンを選択します.注意:Scala分解リロード方法のプロセスはjavaと極めて似ています.いずれの場合も、選択されたリロードバージョンは、パラメータの静的タイプに最も適しています.最も適切なバージョンが1つ以上見つかった場合、コンパイラはリファレンスモデルのエラーを放出します.