我在groovy文件中有一个抽象类:
实施1
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
}
}
这个想法是击中 Material 的端点将返回
Item.bigTestStr()
的返回值。但是,当我跟踪Item.bigTestStr()
时,调试的变量表显示this.testStr
的值,但是将其添加到s
时为null。看这里:我尝试从
testStr
中取出Material
属性实现2
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
}
如何获得该函数在其父类中使用的
Material.testStr
的实际值?更新
正如Emmanuel指出的那样,实现2是使用父类属性的正确方法。但是,此实现似乎不适用于将父类的属性映射到数据库列。因此,真正的问题是:如何获取
Material.testStr
映射到数据库列? 最佳答案
看来您的问题在于如何初始化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
三个类。这两个 Material 类模拟了您的两个测试:MaterialA
具有testStr
属性,而MaterialB
则从Item
继承了具有相同名称的属性。初始化两个类的实例并测试getBigTestStr()
时,将发生以下情况:new MaterialA(testStr: 'Hello').with {
assert bigTestStr == '___null'
}
new MaterialB(testStr: 'Hello').with {
assert bigTestStr == '___Hello'
}
简而言之,继承属性的第二种方法有效。父类(super class)不能(也不应)访问其子类中的任何内容。它甚至不知道其子类。该方法之所以有效,是因为在
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
表。关于grails - Grails-如何在其父类的函数中获取域实体prop的值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34443929/