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