Kotlin运算符重载

作者: 程序员丶星霖 | 来源:发表于2019-06-26 11:49 被阅读10次

    Kotlin的运算符都是靠着特定名称的方法支撑的,因此只要重载这些名称的方法,就可以为任意类型添加这些运算符。

    重载运算符的方法需要用operato修饰符进行标记。

    一、重载单目前缀运算符

    为任意类定义名为unaryPlus()、unaryMinus()、not(),且以operator修饰的方法,程序即可对该类的实例使用+、-、!单目前缀运算符。

    data class Data(val x: Int, val y: Int) {
    
        //为Data类定义一个unaryMinus()方法
        operator fun unaryMinus():Data{
            return Data(-x,-y)
        }
    
    }
    
    //以扩展方法的形式为Data类定义not()方法
    operator fun Data.not(): Data {
        return Data(-x, -y)
    }
    
    fun main(args: Array<String>) {
        val d = Data(4, 10)
        println(-d)
        println(!d)
    }
    

    输出结果:

    Data(x=-4, y=-10)
    Data(x=-4, y=-10)
    

    二、重载自加和自减运算符

    为任意类定义名为inc()、dec(),且以operator修饰的方法,即可对该类的实例使用++、--运算符。

    data class Data(val x: Int, val y: Int) {
    
        //为Data类定义一个inc()方法
        operator fun inc(): Data {
            return Data(x + 1, y + 1)
        }
    
    }
    
    //以扩展方法的形式为Data类定义dec()方法
    operator fun Data.dec(): Data {
        return Data(x-1, y-1)
    }
    
    fun main(args: Array<String>) {
        var d = Data(4, 10)
        println(d++)
        println(d)
        var d2=Data(10,20)
        println(--d2)
        println(d2)
    }
    

    输出结果:

    Data(x=4, y=10)
    Data(x=5, y=11)
    Data(x=9, y=19)
    Data(x=9, y=19)
    

    三、重载双目算术运算符

    为任意类定义名为plus()、minus()、times()、div()、rem()、rangeTo(),且以operator修饰的方法,程序即可对该类的实例使用+、-、*、/、%等运算。

    data class Data(val x: Int, val y: Int) {
    
        //为Data类定义一个minus()方法
        operator fun minus(target:Data): Double {
            return Math.hypot((this.x-target.x).toDouble(),(this.y-target.y).toDouble())
        }
    
    }
    
    //以扩展方法的形式为Data类定义dec()方法
    operator fun Data.times(target: Data): Int {
        return Math.abs(this.x - target.x) * Math.abs(this.y - target.y)
    }
    
    fun main(args: Array<String>) {
        var d = Data(4, 10)
        var d2 = Data(10, 20)
        println("d与d2的距离为:${d - d2}")
        println("d与d2围城的矩形面积为:${d * d2}")
    }
    

    输出结果:

    d与d2的距离为:11.661903789690601
    d与d2围城的矩形面积为:60
    

    学海无涯苦作舟

    我的微信公众号.jpg

    相关文章

      网友评论

        本文标题:Kotlin运算符重载

        本文链接:https://www.haomeiwen.com/subject/xlazxctx.html