问题描述
||
在我的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中使用它。