1

Groovy のユーザー ガイドに例があります。

@Category(Vehicle) class FlyingAbility {
    def fly() { "I'm the ${name} and I fly!" }
}

@Category(Vehicle) class DivingAbility {
    def dive() { "I'm the ${name} and I dive!" }
}

interface Vehicle {
    String getName()
}

@Mixin(DivingAbility)
class Submarine implements Vehicle {
    String getName() { "Yellow Submarine" }
}

@Mixin(FlyingAbility)
class Plane implements Vehicle {
    String getName() { "Concorde" }
}

@Mixin([DivingAbility, FlyingAbility])
class JamesBondVehicle implements Vehicle {
    String getName() { "James Bond's vehicle" }
}

のインスタンスがある場合JamesBondVehicle:

def vehicle = new JamesBondVechile()

vehicle飛行能力があることを確認するにはどうすればよいですか?特に、車両がどのように作成されたかわからない場合。

以下は機能しません。

assert vehicle instanceof FlyingAbility

以下の作品:

assert vehicle.respondsTo('fly')

しかし、これはミックスインの存在を確認するための一般的な方法ではありません。

4

1 に答える 1

1

ありえないと思います。私は Groovy の専門家ではありませんが、少し掘り下げて、コードベースで次の関数を見つけました: MixinInMetaClass.mixinClassesToMetaClass

そこのコードに目を通すと、実際には、混合されているクラスの名前を保持するために何もしていないように見えます。対立。

vehicle.respondsTo('fly')それに基づいて、あなたが得ようとしているのと同じくらい近いように聞こえます。

于 2013-07-27T07:28:24.590 に答える