对于这种情况,我会使用Mixin
:Mixin Reading and Further Mixin Reading
例如:
@Mixin(MyCompare)
class DomainA {
}
@Mixin(MyCompare)
class DomainB {
}
class MyCompare {
def compare(instance1, instance2, propertyName) {
instance1[propertyName] == instance2[propertyname]
}
}
现在 DomainA 和 DomainB 的所有实例都会有你的compare
方法。这样,您可以实现多个 Mixin 以向您想要的域类添加功能,而无需扩展超类或在服务中实现它。(我假设您希望您的compare
方法比这更复杂一点,但您明白了)
一些潜在的陷阱:
1) 's 中的私有方法mixin
似乎不起作用。
2)具有mixin
's 的循环依赖也很糟糕: MixinClassA 混合在 MixinClassB 中,而 MixinClassB 混合在 MixinClassA 中(对于您的设置,我认为您不会mixin
在其他mixin
's 中混合)。
3)我忘记了方法冲突会发生什么,所以你应该尝试一下。示例:ClassA 有一个 doStuff() 方法并在 DoStuffMixin 中混合,后者也有一个 doStuff() 方法。
4) 请记住,在您用作 a 的类中,您mixin
可以引用this
哪个将是使用mixin
. 例如,在上面的示例中,您可以删除 并将其instance1
替换为this
. 在运行时this
将是 DomainA 或 DomainB 的实例(我觉得这是 mixins 的一个非常强大的部分)。
这些是我能想到的大问题。