groovy - 如何从 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
我不想为每个实现该特征的类重写代码。
解决方案
我不同意将状态封装在特征中是一个不错的选择。即使它看起来像是可以做的事情,它也存在与使用状态扩展类相同的问题。
解决您的问题更简单 - 让您的 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'
在其中添加一个字段property
会PropertiesTesting
添加一个正确的getProperty()
方法,并且当您调用getThatProperty()
该特征的方法时,会getProperty()
从PropertiesTesting
类中使用。它更容易,更直接。
推荐阅读
- python - 作为输出的密集列表
- javascript - 未捕获的 ReferenceError:未定义要求 - Electron js
- python - Python 2.7 的操作顺序
- c# - 是否可以在 UWP 的弹出窗口中显示 WebView?
- java - 为什么我的 linearLayout 的行为就像它是空的
- php - Google 驱动器 .zip 文件集权限到期
- java - 如何使用字符串替换方法而不用空字符串替换?
- python - Jupyter Notebooks 不显示进度条
- sql-server - 从一张表插入两张表
- c# - c#SqlKata插入值在记录编译查询时显示为空