我在一个groovy文件中有一个抽象类:
实施1
subunit_to_unit: 100
由
继承public abstract class Item {
public String testStr;
public String getBigTestStr(){
String s = "___" + this.testStr;
return s;
}
}
我们的想法是,点击材质的端点将返回class Material extends Item {
public String testStr;
static marshalling = {
detail {
includes "bigTestStr"
}
summary {
includes "bigTestStr"
}
}
static mapping = {
table 'materialset'
id column: 'NODEID'
testStr column: 'MATERIALTYPE'
version false
}
}
的返回值。但是,当我跟踪Item.bigTestStr()
时,调试的变量表显示Item.bigTestStr()
的值,但在将其添加到this.testStr
时为null。见这里:
我尝试从s
testStr
媒体资源
实施2
Material
但我仍然遇到同样的问题。
对于两种实现,端点都返回
class Material extends Item {
static marshalling = {
detail {
includes "bigTestStr"
}
summary {
includes "bigTestStr"
}
}
static mapping = {
table 'materialset'
id column: 'NODEID'
testStr column: 'MATERIALTYPE'
version false
}
}
如何获取函数在其父类中使用的{
bigTestStr: ____null
}
的实际值?
更新
正如Emmanuel所指出的,实现2是使用父类属性的正确方法。但是,此实现似乎不适用于将父类的属性映射到数据库列。所以真正的问题是:如何让Material.testStr
映射到数据库列?
答案 0 :(得分:2)
看起来您的问题在于如何初始化Material
实例。这是一个例子:
public abstract class Item {
public String testStr
public String getBigTestStr(){
"___$testStr"
}
}
class MaterialA extends Item {
public String testStr
static marshalling = {
detail {
includes 'bigTestStr'
}
summary {
includes 'bigTestStr'
}
}
static mapping = {
table 'materialset'
id column: 'NODEID'
testStr column: 'MATERIALTYPE'
version false
}
}
class MaterialB extends Item {
static marshalling = {
detail {
includes 'bigTestStr'
}
summary {
includes 'bigTestStr'
}
}
static mapping = {
table 'materialset'
id column: 'NODEID'
testStr column: 'MATERIALTYPE'
version false
}
}
上面显示的是三个类Item
,MaterialA
和MaterialB
。这两个材料类模拟了您的两个测试:MaterialA
具有testStr
属性,而MaterialB
则继承了Item
中具有相同名称的属性。这是在初始化两个类的实例并测试getBigTestStr()
时会发生什么:
new MaterialA(testStr: 'Hello').with {
assert bigTestStr == '___null'
}
new MaterialB(testStr: 'Hello').with {
assert bigTestStr == '___Hello'
}
简而言之,继承该属性的第二种方法是有效的。超类不会(也不应该)访问其子类中的任何内容。它甚至知道关于它的子类。该方法有效,因为在testStr
的实例中初始化MaterialB
实际上从Item
初始化了继承的属性;当然可以在Item
课程中访问。
在您的情况下,Grails使用存储在数据库中的值为您初始化实例。所以我会检查你的数据库。
这是使用特征而不是抽象类的示例:
public trait Item {
String testStr
public String getBigTestStr(){
"___$testStr"
}
}
class Material implements Item {
static marshalling = {
detail {
includes 'bigTestStr'
}
summary {
includes 'bigTestStr'
}
}
static mapping = {
table 'materialset'
id column: 'NODEID'
testStr column: 'MATERIALTYPE'
version false
}
}
new Material(testStr: 'Hello').with {
assert bigTestStr == '___Hello'
}
这使得它不需要Item
表。