2012-02-08 14 views
0

私は、サードパーティのサービスクラスで動作する「使用する」カテゴリクラスを持っています。サービスクラスには、xxxRequestクラスとxxxResponseクラスの束と、各xxx呼び出しのデータのための追加の子クラスがあります。カテゴリを使用して関連するカテゴリを「ブートストラップ」することはできますか?

サービスカテゴリが適用されるのと同時に、追加のクラスのそれぞれに自動的にカテゴリを適用したいと考えています。

私は使用ブロック内のすべてのカテゴリクラスを一覧表示できましたが、その多くはあり、その詳細を公開したくありません。ベースクラスはコントロールできませんので、@ category/@ mixinは使用できません。

現在、私は一連のmixin呼び出し(奇数のコンストラクターを追加するだけでなく)を行うサービスカテゴリに静的な初期化メソッドを持っています。これは正常に動作しますが、私が望むスコープは提供していません。

もっと簡単な方法がありますか?

答えて

2

私はあなたがしようとしていることを理解していません。 use多くのカテゴリを同じコードブロックで一度にしようとしているが、それらを使用するたびにそれらのカテゴリをすべて一覧にしたくない場合(それがあなたの意図したものでない場合は修正してください)そのブロックの長さはuseで、コードブロック(Closure)をパラメータとし、そのメソッドを長い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 

、文字列と整数のクラスは、あなたが強化したいクラスだろうが、あなたはへのアクセス権を持っていない、との束を含んでいる大きなカテゴリなどのuseAwesomeExtensions行為他のカテゴリの希望が助けてくれます:)

+0

これは、use(AwesomeExtensions)とAwesomeExtensionsカテゴリを別々のクロージャを使用するのではなくShoutCategoryとToEnglishCategoryを設定することを除いて、好きなものです –

+0

@MichaelRutherfurdええ、@Mixinカテゴリをより大きなカテゴリにミックスすることはできましたが、うまくいかないようでした。使用方法はわずかに異なりますが、このソリューションはあなたが達成したいものに適応していますか? – epidemian

関連する問題