【在主画面加入捷径】
       
【选择语系】
繁中 简中

[Groovy] 程序设计教学:藉由运算符重载 (Operator Overloading) 使程序代码更简洁

【赞助商连结】

    前言

    在面向对象程序中,运算符重载 (operator overloading) 是一个非必备的功能,算是一种让物件使用的语法更简洁的语法糖;不一定每个能实现物件的语言都有运算符重载的功能,像是 C++ 有运算符重载但 Java 则无。

    Groovy 官网对运算符重载并不算特别注重,仅用一点点篇幅来介绍。在 Groovy 中,要实现运算符重载相当简单,只要实现特定的方法 (method),就自动拥有运算符重载的功能。

    实例展示

    以下 Vector 物件利用运算符重载的特性实现向量加法:

    class Vector {
        private List arr
        
        public Vector(Integer size) {
            this.arr = []
            
            size.times { this.arr << 0.0 }
        }
        
        public Vector(List arr) {
            this.arr = []
            
            arr.each { this.arr << it }
        }
    
        public getAt(Integer i) {
            return this.arr[i]
        }
        
        public Vector plus(Vector other) {
            def out = new Vector(this.arr.size())
            
            for (def i = 0; i < out.arr.size(); i++) {
                out.arr[i] = this.arr[i] + other.arr[i]
            }
            
            return out
        }
    }

    这个物件的关键在于我们实现了 getAtplus 两个方法;前者用在向量中以一对 [] 以索引取值,后者用在两物件间相加。

    我们以一个简短的外部程序来看如何使用这个物件:

    def a = new Vector([1, 2, 3])
    def b = new Vector([2, 3, 4])
    def c = a + b  // Vector addition.
    
    assert c[0] == 3  // Element retrieving by index.
    assert c[1] == 5
    assert c[2] == 7

    虽然这个程序很短,由这个例子可以看出,适当地使用运算符重载,的确会让程序代码更简洁。

    结语

    在本文范例中,我们重载了两个方法,之后向量物件就可以使用相关的运算符而不需要使用函式调用来操作物件。运算符重载的简洁性要在外部程序中才容易彰显出来,读者可看一下本范例中外部程序的部分即可了解。

    然而,若在实现运算符重载时埋下 bug,调试上也是相对困难。若这个 bug 来自第三方函式库,调试上会更加困难,因为程序设计师甚少会在第一时间就直接追踪第三方函式库的程序代码。

    在实现运算符重载时,应该要符合程序人的直觉,才是好的公开界面。例如,+ (加号) 应该要用在相加 (addition) 或是相接 (concatenation) 等概念的任务上,而不要任意用在其他的用途。

    【赞助商连结】
    TAGS: GROOVY, JAVA