Можно ли использовать категорию для «загрузки» группы связанных категорий? - PullRequest
0 голосов
/ 08 февраля 2012

У меня есть класс категории, который я хочу использовать, который действует на сторонний класс обслуживания. Класс обслуживания имеет набор классов xxxRequest и xxxResponse, а также дополнительные дочерние классы для данных для каждого вызова xxx.

Я хочу автоматически применять категории к каждому из дополнительных классов в то же время, когда применяется категория обслуживания, с той же областью действия.

Я мог бы перечислить все классы категорий в блоке использования, но их много, и я не хочу раскрывать эту деталь. Базовые классы находятся вне моего контроля, поэтому я не могу использовать @ category / @ mixin.

В настоящее время в моей категории услуг есть метод статической инициализации, который выполняет серию смешанных вызовов (а также добавляет нечетный дополнительный конструктор). Это работает хорошо, но не предоставляет область, которую я хочу.

Есть ли более простой способ, который я пропустил?

1 Ответ

2 голосов
/ 08 февраля 2012

Я не уверен, что понимаю, что вы пытаетесь сделать.Если вы пытаетесь use нескольких категорий одновременно в одном блоке кода, но не хотите перечислять все эти категории каждый раз, когда хотите их использовать (пожалуйста, исправьте меня, если вы не это имели в виду), выможет поместить это длинное use в метод, который принимает блок кода (Закрытие) в качестве параметра, а затем использовать этот метод вместо длинного use.Что-то вроде:

@Category(String)
class ShoutCategory {
    def shout() {
        this.toUpperCase() + '!'
    }
}

@Category(Integer)
class ToEnglishCategory {
    def toEnglish() {
        // Only works for integers in 0..5 for now...
        ['zero', 'one', 'two', 'three', 'four', 'five'][this]
    }
}

def useAwesomeExtensions(Closure cl) {
    use (ShoutCategory, ToEnglishCategory) {
        cl()
    }
}

useAwesomeExtensions {
    // Here we can do all sorts of magic things.
    println 3.toEnglish().shout() // Outputs "THREE!"
}

// "hello".shout() -> Would throw a MissingMethodException here

В этом глупом примере классы String и Integer будут классами, которые вы хотите расширить, но у вас нет к ним доступа, а useAwesomeExtensions действует как большая категорияэто включает в себя кучу других категорий.Надеюсь, это поможет:)

...