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')
但这不是检查mixin presense的通用方法,例如如果我有两个看起来完全相同的mixin,但只是以不同方式实现的东西怎么办?
答案 0 :(得分:1)
我不认为这是可能的。我不是Groovy的专家,但我做了一点挖掘并在代码库中找到了这个函数:MixinInMetaClass.mixinClassesToMetaClass
如果你查看那里的代码,似乎没有做任何事情来实际保留混合的类的名称。相反,它只是遍历所有属性并将它们合并到目标类中,如果有的话不是冲突。
基于此,听起来vehicle.respondsTo('fly')
就像你将要获得的那样接近。