Grails:鸭类输入法和多对多收集类

问题描述

|| 在我的Grails应用中,一个人喜欢某件事-某件事可以是一个想法,一个决定,一个小组或另一个人。 在Java中,我将施加Something接口,以便可以将这些类中的每一个作为Something类型传递。 在Groovy / Grails中,我在Something是Groovy类而Fondness类是将Persons映射到Somethings的集合类中工作。 在这种情况下,当我尝试利用Duck Typing时,我会感到迷st。如何设置将Person映射到我的任何一组类的集合类,而无需施加接口? 感谢您的任何建议!我很高兴听到G / G开发人员将如何实现这一目标。 -法案     

解决方法

我遇到了这个Nabble线程,它可能与您所追求的相似。这是一个有趣的解决方案,看起来有些怪异,但可能会正常工作。 这是线程中的代码示例(由Martin Dow提供-如果他遇到了这个问题并将其发布为答案,我将从其答案中删除它并给予他投票)。
class SomeDomainClass { 
  Long associationId
  String associationClass
  def getAssociation() {
    // Handle proxied class names
    def i = associationClass.indexOf(\'_$$_javassist\')
    if (i > -1) associationClass = associationClass[0..i-1]
    getClass().classLoader.loadClass(associationClass).get(associationId)
  }
  def setAssociation(association) {
    associationId = association.id
    associationClass = association.class.name
  }
}
这里有一些确实涉及可能会给您一些方向的类型的选项。 枚举
class Person {
    static hasMany = [fondnessess: Something]
}

enum Something {
    ONE_SOMETHING,ANOTHER_SOMETHING;
}
遗产 (我不是继承的最大拥护者,但是有时候这是一个好的解决方案。)
class Person {
    static hasMany = [somethings: Something]
}

class Something {
    // could be abstract,but look out for
    // http://jira.grails.org/browse/GRAILS-6780
}

class OneSomething extends Something { ... }

class AnotherSomething extends Something { ... }
这取决于每个“ 3”实现需要定义多少逻辑。这两个示例都可以使用,并且可能还有其他解决方案。     ,另一个选择是抽象基类。 1.4中对此功能的支持得到了很大的改进-请参阅http://jira.grails.org/browse/GRAILS-2583-您可以在本周发布的1.4M1中使用它。