4、面向对象

2019-03-11  本文已影响0人  最美下雨天
元编程

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()



测试: 重写invokeMethod方法

增加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}"
    }

}

增加methodMissing方法

为类动态添加属性、方法、静态方法

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()


上一篇 下一篇

猜你喜欢

热点阅读