我在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。看这里:

grails - Grails-如何在其父类的函数中获取域实体prop的值-LMLPHP

我尝试从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
  }
}

但我仍然遇到同样的问题。

grails - Grails-如何在其父类的函数中获取域实体prop的值-LMLPHP

对于这两种实现,端点都将返回
{
  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
  }
}

上面显示的是ItemMaterialAMaterialB三个类。这两个 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/

10-11 07:12