
Groovy中有个新增的类型 Trait ,翻译过来是”特征“的意思,Trait失身意思呢?就相当于java中的接口适配器
groovy中,接口interface和特征trait都需要去实现,关键字:implements,不是extends
接下来看下最上面的图的含义:
接口Action
package object
/**
* 接口中的方法都是public的,不允许定义非public的
*/
interface Action {
void eat()
void drink()
void play()
}
特征trait
package object
trait DefaultAction {
abstract void eat()
void play()
{
println 'Trait中的方法可以提供默认实现'
}
}
类Person
package object
class Person{
String name
int age
def incrementAge(int years)
{
this.age+=years
}
}
调用:
import object.Person
Person person=new Person(name:"张三",age: 20)
person.incrementAge(10)
println person.age //输出:30
//注意Person类中并没有定义cry()方法
person.cry() //编译不会报错,运行会出错
重写invokeMethod方法
根据最上面的图,我们修改Person类
Person类增加invokeMethod方法
修改代码:
package object
class Person{
String name
int age
def incrementAge(int years)
{
this.age+=years
}
@Override
Object invokeMethod(String name, Object args) {
return "the method is name is ${name},方法的参数是${args}"
}
}
import object.Person
Person person=new Person(name:"张三",age: 20)
person.incrementAge(10)
println person.age //输出:30
//注意Person类中并没有定义cry()方法
println person.cry()
测试:

增加methodMissing方法
修改Person类:
package object
class Person{
String name
int age
def incrementAge(int years)
{
this.age+=years
}
@Override
Object invokeMethod(String name, Object args) {
return "the invokeMethod is name is ${name},方法的参数是${args}"
}
def methodMissing(String name,Object args)
{
return "this methodMissing name is ${name},方法的参数是${args}"
}
}

为类动态添加属性、方法、静态方法
import object.Person
ExpandoMetaClass.enableGlobally()
//动态添加一个属性
Person.metaClass.sex='male'//先增加属性,再定义Person
//动态添加一个方法
Person.metaClass.setUpperCase={
-> sex.toUpperCase()
}
//动态添加一个静态方法
Person.metaClass.static.createPerson={
String name,int age->
new Person(name:name,age:age)
}
//利用动态添加的静态方法创建一个对象
def person=Person.createPerson("张三",20)
println person.sex
println person.setUpperCase()
网友评论