Inheritance 通用域方法的继承还是服务?

Inheritance 通用域方法的继承还是服务?,inheritance,grails,grails-domain-class,Inheritance,Grails,Grails Domain Class,我有一些在我的一些域类中通用的方法。我想减少复制代码的数量,于是想到了两种解决方案:1)将通用方法放在baseDomain类中,并在我的域中继承它的方法2)将通用方法放在commonDomainMethodService中,我可以将其导入到我的域中我认为应该不使用继承,除非域共享公共属性,但我不确定。这些方法中的一种比另一种更有益吗?还有一个符合Grails最佳实践吗?例如,一个基于参数比较两个域实例的方法: int compareInstances(instance, otherInstanc

我有一些在我的一些域类中通用的方法。我想减少复制代码的数量,于是想到了两种解决方案:

1)将通用方法放在baseDomain类中,并在我的域中继承它的方法
2)将通用方法放在commonDomainMethodService中,我可以将其导入到我的域中

我认为应该不使用继承,除非域共享公共属性,但我不确定。这些方法中的一种比另一种更有益吗?还有一个符合Grails最佳实践吗?

例如,一个基于参数比较两个域实例的方法:

int compareInstances(instance, otherInstance, propertyName){
    return //some logic to compare the instances based on the type of property
}

在这种情况下,我将使用一个
Mixin
:和

例如:

@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)
mixin
中的私有方法似乎不起作用

2) 有一个循环依赖的
mixin
也是不好的:MixinClassA在MixinClassB中混合,而MixinClassB在MixinClassA中混合(对于您的设置,我认为您不会在其他
mixin
中有
mixin的混合)

3) 我忘记了方法冲突会发生什么,所以您可能应该进行实验。示例:ClassA有一个doStuff()方法,并与DoStuffMixin混合,后者也有一个doStuff()方法

4) 请记住,在用作
mixin
的类中,可以引用
this
,它将是使用
mixin
的对象的实例。例如,在上面的示例中,您可以删除
instance1
,并将其替换为
this
。在运行时,
这个
将是DomainA或DomainB的一个实例(我觉得它是mixin中非常强大的一部分)


这些是我能想到的最大难题。

你能举个例子说明你需要实现的方法类型吗?这取决于你处理的逻辑类型。如果您可以发布一些有问题的代码,这将非常有帮助。例如,一个方法提供了一个域的两个实例,并根据一个属性(也作为参数提供)对它们进行比较。Ooo,更值得学习的groovy优点。谢谢你提供阅读材料。你知道在Grails中使用Mixin时会遇到什么问题吗?