1

在我的 Grails 应用程序中,一个人对某事有一种喜爱——而某事可能是一个想法、一个决定、一个小组或另一个人。

在 Java 中,我会强加一个 Something 接口,以便这些类中的每一个都可以作为 Something 类型传入。

在 Groovy/Grails 中,我让它在Something 是一个Groovy 类和Fondness 类是一个将Persons 映射到Somethings 的集合类的地方工作。

在这种情况下,当我尝试利用 Duck Typing 时,我绊倒了。如何设置一个集合类,将 Person 映射到我的任何一组类,而不强加接口?

感谢您的任何建议!我很高兴听到 G/G 开发人员将如何处理这个问题。

-账单

4

2 回答 2

1

另一种选择是抽象基类。对此的支持在 1.4 中得到了很大改进 - 请参阅http://jira.grails.org/browse/GRAILS-2583 - 您可以在本周发布的 1.4M1 中使用它。

于 2011-05-23T16:59:02.357 回答
0

我遇到了这个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 { ... }

这取决于每个Something实现需要定义多少逻辑。这两个示例都可以工作,并且可能还有其他解决方案。

于 2011-05-23T14:54:13.653 回答