前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Groovy之面向对象

Groovy之面向对象

作者头像
Yif
发布2019-12-25 17:59:49
3170
发布2019-12-25 17:59:49
举报
文章被收录于专栏:Android 进阶Android 进阶
undefined
undefined

Groovy中的类与Java类似,不同的是它可以通过对象实例化名字直接调用属性值,不需要通过get进行获取值。

代码语言:javascript
复制
/**
 * Groovy 默认都是public
 */
class Person {
    String name
    Integer age
 
    def increase(Integer year){
        this.name += year
    }
}
/**
 * 无论是通过.调用还是直接get/set方法都是最终调用get/set方法
 */
def person = new Person(name: 'yif',age: 25)
//println "this name is ${person.name},this age is ${person.age}"
println "this name is ${person.getName()},this age is ${person.getAge()}"
println person.increase(100)

接口

接口与Java一样

代码语言:javascript
复制
interface Action {
    void eat();
    void drink();
 
}
class Person implements Action{
    String name
    Integer age
 
    def increase(Integer year){
        this.name += year
    }
 
    @Override
    void eat() {
 
    }
 
    @Override
    void drink() {
 
    }
}

Trait

trait是一组可重用的方法和字段,可以将它们混入到一个或多个类中。一个类可以同时拥有多个trait而不需要使用多重继承 可以通过this 直接访问trait 关键字中的实例println "${this.class.name} is eating..."

代码语言:javascript
复制
/**
 * Trait 是一个可以重用的方法字段,一个类可以有多个trait,避免了多重继承问题,类使用implements进行实现,新的trait使用extends继承原来的trait
 */
 
trait SwimActive{
    def swim(){
        println 'swimming...'
    }
}
 
trait FlyActive{
    def fly(){
        println 'flying...'
    }
}
 
/**
 * 可以通过this 直接访问trait 关键字中的实例
 */
trait EatActive{
    def eat(){
        println "${this.class.name} is eating..."
    }
}
 
class Duck implements SwimActive,FlyActive,EatActive{}
 
def duck = new Duck()
duck.swim()
duck.fly()
duck.eat()

trait 覆盖,扩展与冲突

代码语言:javascript
复制
 
/**
 * Trait 支持方法的覆盖
 */
trait Dealer {
    def getProfit() {
 
    }
    def deal() {
        println 'hello dealer'
    }
}
 
//CarDealer继承了Dealer,同时也覆盖了Dealer中的deal方法
trait CarDealer extends Dealer {
    def deal() {
        println 'hello car dealer'
    }
}
 
//Car 实现了CarDealer接口,同时也覆盖率deal方法
class Car implements CarDealer{
    def deal(){
        println 'hello car'
    }
}
def car = new Car()
car.deal()
 
/**
 * 一个类实现多个trait,有可能产生冲突,因为使用了多个方法签名
 */
trait Bus{
    def drive(){
        println 'bus drive'
    }
}
 
trait Bike{
    def drive(){
        println 'bike drive'
    }
}
 
//这里只有后一个trait类生效,也就是Bike有效
class TestTrait implements Bus,Bike{}
def test = new TestTrait()
test.drive()
代码语言:javascript
复制
trait DefaultAction {
    //是抽象类型方法需要加一个abstract
    abstract void eat()
    //不是抽象方法需要加一个空实现
    void play(){
        println 'i can play'
    }
}
class Person implements DefaultAction{
    String name
    Integer age
 
    def increase(Integer year){
        this.name += year
    }
 
    @Override
    void eat() {
 
    }
}

元编程

metaclass的优先级最高,会首先判断类对象是否通过metaclass进行添加方法或者属性

代码语言:javascript
复制
//通过metaClass 为类添加其他属性
Person.metaClass.sex = 'male'
def persiontwo = new Person(name: 'ztz',age: 34)
println persiontwo.sex
 
//还可以进行修改属性的值
persiontwo.sex = 'female'
println persiontwo.sex
//为类进行动态添加方法,将性别进行大写转换
Person.metaClass.sexUpperCase = { -> sex.toUpperCase()}
println persiontwo.sexUpperCase()
/**
 * 为类动态添加静态方法,在开源库中,可以不修改代码,不继承类,通过groovy自带的metaClass类进行动态修改源码,添加方法属性扩展原有的类
person构造方法必须传入name 与age这两个key进行赋值,否则报错
 */
Person.metaClass.static.createStaticPerson = {String name,int age -> new Person(name: name,age: age)}
//createStaticPerson只是一个方法无需再传入name与age这两个key进行赋值
def person3 = Person.createStaticPerson('yif',44)
println person3.name + " and "+person3.age

ExpandoMetaClass.enableGlobally():将外部注入的属性与方法设置为全局可以使用

代码语言:javascript
复制
class Entry {
    static void main(def args){
        println '应用程序正在启动...'
        ApplicationManager.init()
 
        println '应用程序启动完成'
 
        def person = PersonManager.createPerson('ztz',34)
        println person.name + " and " +person.age
    }
}
/**
 * 模拟应用管理类
 */
class ApplicationManager {
    static void init(){
        //将外部注入的属性与方法设置为全局可用
        ExpandoMetaClass.enableGlobally()
        //为第三方类进行添加方法
        Person.metaClass.static.createPerson = {String name,int age ->
            new Person(name:name,age: age)
        }
    }
}
/**
 * person 类型管理器
 */
class PersonManager {
    static Person createPerson(String name,int age){
        return Person.createPerson(name,age)
    }
}

如果没有则进行判断是否重写了methodMissing方法

代码语言:javascript
复制
//methodMissing的优先级高于invokeMethod方法,会首先被调用
def methodMissing(String name,Object args){
    return "the method $name is missing"
}

没有进行重写methodMissing方法则进行判断是否重写了invokeMethod方法,都没有则进行异常抛出

代码语言:javascript
复制
//如果重写了invokeMethod方法,方法没有定义,就会调用该方法
def invokeMethod(String name,Object args){
    return "the method is $name,the params is $args"
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年11月12日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 接口
  • Trait
  • 元编程
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档