`
ihuashao
  • 浏览: 4710453 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

Groovy探索之运算符的重载 二

阅读更多

Groovy探索之运算符的重载

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

前一篇详细的说了说算术运算符和关系运算符的重载,这篇要说说赋值运算符和取值运算符,即“.”运算符的重载。

还是以前一篇的Yuan类来作为例子。

class Yuan

{

def num

def toString()

{

this.num

}

}

有了上面的类的定义,我们就可以如下使用这个类:

def y = new Yuan()

y.num = 109

println y.toString()

其中,“y.num = 109”就是一个赋值语句,关键的运算符就是“.”;当然,我们还可以用该运算符进行取值运算,如下:

println y.num

我们今天要说的就是对“.”运算符的重载。当然,只要我们稍微一想,就可以知道,该运算符应该和“set”和“get”方法有关。不错,的确如此。

下面,我们来看看如何重载“.”运算符。

class Yuan

{

def num

def getOwner()

{

print &apos;tom&apos;

}

def toString()

{

this.num

}

}

要重载取值运算,当然只要“get”方法就行了,注意看代码中的“getOwner()”方法,实现了它,我们就可以写出“y.owner”这样的代码来。

下面来看我们的测试代码:

def y = new Yuan(num:100)

y.owner

println " has ${y.toString()} yuan."

运行结果为:

tom has 100 yuan.

当然,重载赋值运算就和“set”方法相关了,如下:

class Yuan

{

def num

def setOwner(name)

{

println name

}

def toString()

{

this.num

}

}

测试代码如下:

def y = new Yuan(num:100)

y.owner = &apos;mike&apos;

可以看到,“.”运算符的重载跟其他运算符的重载也都一样,没有什么特别的地方。但为什么要把它拿出来单独成一篇呢?这是因为它跟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,即元对象。

下面是实现上面的场景的代码:

def mc = new ExpandoMetaClass(Integer.class,true)

mc.getYuan <<

{

->

delegate as float

}

mc.getJiao <<

{

->

def j = delegate as float

j/10

}

mc.getFen <<

{

->

def f = delegate as float

f/100

}

mc.initialize()

首先取得Integer类的元对象:“def mc = new ExpandoMetaClass(Integer.class,true)”。

然后,再添加各个“get”方法,因为我们只需要实现取值运算,因此,只需要实现“get”方法就可以了。

最后实例化这个元对象,即“mc.initialize()

现在,我们来测试这段代码:

println 12.yuan+45.jiao+33.fen

结果为:

16.83

运算符的重载是Groovy语言实现DSL的一个很重要的方面,因此,我们拿出两个章节才把它说完,希望我们在今后的编码实践中经常的使用到它。

分享到:
评论

相关推荐

    groovy入门经典,groovyeclipse 插件

    此外,Groovy的运算符重载和元编程能力使代码更加简洁和动态。 在安装GroovyEclipse插件后,开发者可以通过Eclipse的New -&gt; Groovy Project来创建Groovy项目。插件还会提供Groovy编译器,确保代码的正确性。同时,...

    The Groovy 2 Tutorial(LeanPub)

    运算符重载、位运算符和复合赋值运算符也是重点。 18. **赋值运算符**:Groovy的赋值运算符比许多其他编程语言的要简单。简单赋值运算符直接将右边表达式的结果赋值给左边的变量。 19. **条件运算符**:包括条件与...

    Groovy 学习笔记

    5. **运算符重载和方法默认参数**: Groovy允许操作符重载和方法定义默认参数,增强了代码的可读性和灵活性。 **二、Groovy与Java的交互** 1. **类和接口**: Groovy可以创建Java兼容的类和接口,因此可以直接与Java...

    groovy-windows-installer

    4. **Operator Overloading(运算符重载)**:Groovy允许自定义运算符的行为,增加代码的灵活性。 5. **Metaprogramming(元编程)**:Groovy提供了丰富的API来修改或扩展程序的结构和行为,甚至在运行时。 对于...

    groovy入门经典

    5. **运算符重载和方法缺失**:Groovy允许自定义运算符,同时,如果对象没有某个方法,Groovy会尝试寻找与之相似的方法名,这被称为方法缺失。 6. ** Grape**:Grape是Groovy的依赖管理工具,类似Java的Maven或...

    Groovy安装、语法和事例文件

    6. **运算符重载和元编程**: Groovy允许自定义运算符行为,并可以通过元编程动态修改类的行为。 ### Groovy实例 下面是一些简单的Groovy代码示例,展示其语法的简洁性: ```groovy // 定义一个类 class Person { ...

    Groovy语法系列教程之字符串(三).pdf

    Groovy的设计哲学是让程序员能够用更少的代码做更多的事情,这体现在它的语法上,如无需声明变量类型、支持闭包和运算符重载等特性。 #### 字符串的种类与特性 Groovy中的字符串处理与Java有所不同,主要表现在字符...

    Groovy学习笔记

    - **表达式**:Groovy支持使用各种表达式,包括数字、变量、运算符等。 - **Java类的使用**:可以直接使用Java中的类和方法,甚至在表达式中。 - **方法定义**:定义方法与Java相似,但Groovy中可以省略`return`...

    Groovy入门教程

    - **运算符重载**:Groovy允许用户自定义运算符的行为。 - **多重方法**:允许相同名称的方法具有不同的行为,这取决于传入参数的类型。 - **列表、映射、范围和正则表达式的字面量声明**:Groovy提供了简洁的方式来...

    Groovy程序设计与实践1

    它还支持运算符重载,可以根据需要自定义操作符的行为。 4. **程序结构(Program structure)**:在Groovy中,可以使用包名和导入语句组织代码,同时支持脚本和类两种主要的程序结构形式。 5. **面向对象(Object ...

    Groovy in Action, Second Edition 源码

    2. **语法简洁性**:Groovy的语法比Java更为简洁,如三元运算符、方法链和闭包等,使得代码更易读写。 3. **闭包**:Groovy中的闭包是其核心特性之一,类似于JavaScript的函数引用,可以作为参数传递,也可以作为...

    top10groovyfeatures:codebulb.ch 博客文章中的代码示例

    7. **运算符重载**:Groovy允许自定义运算符,这使得创建符合直觉的类和接口变得更加简单。 8. **GroovyShell和GroovyScriptEngine**:这两个工具允许在运行时执行Groovy代码,非常适合快速原型开发和脚本编写。 9...

    我的观点

    8. **Operator Overloading**: Groovy支持运算符重载,允许开发者为自定义类定义如何处理各种运算符。 9. **GDK (Groovy Development Kit)**: Groovy提供了一套扩展的Java标准库,称为GDK,包含许多方便的方法,如`...

    kotlin中文文档

    包括基本语法、习惯用语、编码风格、基础类型、包、控制流、返回与跳转、...运算符重载、空安全、异常、注解、反射、动态类型、互用性、工具、动态类型、Kotlin代码文档、构建工具使用(如Maven、Ant、Griffon和Gradle...

    Kotlin中文文档

    - **运算符重载**: 可以为类重载运算符。 - **空安全**: Kotlin的设计目标之一就是避免空指针异常。 - **异常**: 提供了标准的异常处理机制。 - **注解**: 用于提供额外的元数据。 - **反射**: 提供了反射API来查询...

    java大纲资料.txt

    - **发展背景**:随着互联网的发展,Java 成为了企业级应用、Web 应用和移动应用等领域的首选编程语言之一。 - **版本演进**:自 1995 年以来,Java 经历了多次重大更新,包括 Java 2 (J2SE)、Java 5、Java 8 等,...

Global site tag (gtag.js) - Google Analytics