Grails: классы утки и много-много коллекций - PullRequest
1 голос
/ 23 мая 2011

В моем приложении Grails у Человека есть Любовь к чему-то - и что-то может быть Идеей, Решением, Группой или другим Человеком.

В Java я навязал бы интерфейс Something, чтобы каждый из этих классов мог быть передан как тип Something.

В Groovy / Grails у меня это работало, где Something - это класс Groovy, а класс Fondness - это класс коллекции, который отображал Persons в Somethings.

Я спотыкаюсь, когда пытаюсь использовать Duck Typing в этом случае. Как настроить сопоставление класса коллекции Person с любым из моей группы классов без наложения интерфейса?

Спасибо за любой совет! Я рад услышать, как разработчики G / G подошли бы к этому.

-Билль

Ответы [ 2 ]

1 голос
/ 23 мая 2011

Другой вариант - абстрактный базовый класс.Поддержка этого значительно улучшена в версии 1.4 - см. http://jira.grails.org/browse/GRAILS-2583 - и вы можете использовать ее в версии 1.4M1, которая будет выпущена на этой неделе.

0 голосов
/ 23 мая 2011

Я наткнулся на эту Набедренную ветку , которая может быть похожа на то, что вы ищете.Это интересное решение, и кажется довольно хакерским, но, вероятно, будет работать нормально.

Вот пример кода из потока (любезно предоставлен 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 реализации.Оба эти примера можно заставить работать, и, возможно, есть и другие решения.

...