当对象应该返回自己的修改副本时,是否有可能避免代码重复?

我目前正在写一些代表符号数学expression式的类。 所有这些都是不变的。

然而,我发现自己经常重复同样的结构,所以我创建了一个接口来避免重复,但发现自己无法避免重复“substituteInside”方法(见下文),该方法返回对象的副本, “find”替换为“replace”。

这个行为对于这个接口的所有实例是一样的。

在我目前的解决方案中,接口需要实现一个方法createOp ,它返回对象的修改副本。

 interface UnarySymbolicOp<InType : Any, OutType : Any, OpType : UnarySymbolicOp> : Symbolic { // Arg may be a complex expression val arg: Symbolic fun createOp(mesh: Symbolic) : OpType override val variables get() = arg.variables override fun  substituteInside(find: Symbolic, replace: Symbolic): OpType { return createOp(arg.substitute(find, replace)) } } 

接口可以实现如下:这些类表示获取expression式的某个组件的操作。

 data class GetX(override val arg: Symbolic) : UnarySymbolicOp { override fun createOp(mesh: Symbolic) = GetX(arg) override fun eval() = arg.eval().x } data class GetY(override val arg: Symbolic) : UnarySymbolicOp { override fun createOp(mesh: Symbolic) = GetY(arg) override fun eval() = arg.eval().y } data class GetZ(override val arg: Symbolic) : UnarySymbolicOp { override fun createOp(mesh: Symbolic) = GetZ(arg) override fun eval() = arg.eval().z } 

这改善了事情,因为其他方法返回的对象的副本可以使用该方法,因此可以住在接口,但我仍然必须复制这个方法无处不在,而它基本上总是做同样的事情。