美文网首页
4、面向对象

4、面向对象

作者: 最美下雨天 | 来源:发表于2019-03-11 10:57 被阅读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()


相关文章

  • 面向对象4

    一、判断数组和对象 二、浅克隆 三、深克隆 四、引用值 五、类数组

  • 4 - 面向对象

    封装 数据的封装 方法 在上面的例子中,如果你将 * 去掉,你会发现打印出的地址是两个不同的地址,也就是说,如果我...

  • 4、面向对象

    Groovy中有个新增的类型 Trait ,翻译过来是”特征“的意思,Trait失身意思呢?就相当于java中的接...

  • 面向对象4

    获取对象信息 当我们拿到一个对象的引用时,如何知道这个对象是什么类型、有哪些方法呢? 使用type() 首先,我们...

  • 4面向对象

    [TOC] 面向对象 1. 面向对象的基本概念 1.1 什么是面向对象编程。 准确的说面向对象编程我们叫 OOP....

  • 06-面向对象作业第1部分

    1、什么是面向过程? 2、什么是面向对象? 3、面向对象的三大特性是什么? 4、什么面向对象的好处是什么? 5、什...

  • Lua-基本语法

    1.基本语法 2.表 3.数组 4.面向对象之复制表的方式面向对象 5.面向对象之函数闭包的方式面向对象

  • RYF javascript笔记3

    4. 面向对象编程 4.1面向对象编程概述 4.1.1简介 4.1.1.1构造函数 js没有“类”,而改用构造函数...

  • Kotlin——面向对象(4)

    1、面向对象-抽象类与接口 1)什么是接口接口,直观理解就是一种约定kotlin的接口与Objcet-C的Prot...

  • 4.面向对象

    1.常量与变量 val修饰的称为常量,只能赋值一次,类似java中的finalvar修饰的称为变量,可以赋值n次k...

网友评论

      本文标题:4、面向对象

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