首页 > 解决方案 > 如何从 Groovy 中的 trait 实现中获取属性?

问题描述

我有一个特质,叫做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我不想为每个实现该特征的类重写代码。

标签: groovy

解决方案


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

解决您的问题更简单 - 让您的 trait 定义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'

在其中添加一个字段propertyPropertiesTesting添加一个正确的getProperty()方法,并且当您调用getThatProperty()该特征的方法时,会getProperty()PropertiesTesting类中使用。它更容易,更直接。


推荐阅读