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')

但这不是检查 mixin 存在的通用方法,例如,如果我有 2 个看起来完全相同的 mixin,但只是以不同的方式实现东西怎么办?

4

1 回答 1

1

我不认为这是可能的。我不是 Groovy 的专家,但我做了一点挖掘,在代码库中找到了这个函数:MixinInMetaClass.mixinClassesToMetaClass

如果您查看那里的代码,它似乎并没有做任何事情来实际保留混入的类的名称。相反,它只是遍历它们的所有属性并将它们合并到目标类中,如果没有冲突。

基于此,听起来就像vehicle.respondsTo('fly')您将要获得的一样接近。

于 2013-07-27T07:28:24.590 回答