如何从Groovy中的特征实现中获取属性?

时间:2018-08-17 11:37:29

标签: groovy

我有一个特征,叫做MyTrait

package properties

trait MyTrait {
    abstract String property

    String getThatProperty() {
        "$property is that property"
    }
}

然后我有一个实现该特征的类。

package properties

class PropertiesTesting implements MyTrait {
    String property = 'Hello'
}

问题是,当我去打电话给PropertiesTesting#getThatProperty()时,它返回"null is that property"。如何解决此问题,使其根据实现的不同而返回"x is that property"x?我不想为实现该特征的每个类重写代码。

3 个答案:

答案 0 :(得分:1)

我不同意将状态封装在特征中是一个不错的选择。即使它看起来像是可以做的事情,它所带来的问题也与扩展类的状态一样。

解决问题的方法甚至更加简单-让您的特征定义abstract String getProperty()方法。像这样:

trait MyTrait {
  abstract String getProperty()

  String getThatProperty() {
    "$property is that property"
  }
}

class PropertiesTesting implements MyTrait {
  String property = 'Hello'
}

def properties = new PropertiesTesting()

assert properties.getThatProperty() == 'Hello is that property'

property中添加字段PropertiesTesting会添加正确的getProperty()方法,当您调用getThatProperty()方法的特征时,将使用{{1 }}类。更简单,更直接。

答案 1 :(得分:0)

答案是简单地使用object.properties

要获取property的属性PropertiesTesting,我可以使用instance.properties['property']

答案 2 :(得分:0)

它采用特征的属性(为null)而不是类的属性。 注释掉特征的String属性,并在要打印句子时添加println命令。

package properties

trait MyTrait {
    //abstract String property

    String getThatProperty() {
        println "$property is that property"
    }
}
class PropertiesTesting implements MyTrait {
    String property = 'Hello'
}
def instance = new PropertiesTesting()
instance.getThatProperty()