我知道,“循环依赖关系是一个错误的设计”,但我认为在这种情况下,这是有必要的。
在构建voronoi图时,将单元划分为所谓的“半边”,这使您可以方便地遍历图。
无论如何,为了实例化一个半边,我必须指定半边的镜像或两个。
这在任何语言中都很时髦,但是在Kotlin中,这更令人讨厌,因为我必须像我希望的那样使用可为空的var而不是val。
现在我正在做这种我不喜欢的时髦。
val mirrorEdge: HalfEdge
get() = halfEdge!!
private var halfEdge: HalfEdge? = null
fun setMirror(halfEdge: HalfEdge) {
this.halfEdge = halfEdge
}
//别处
newEdge.setMirror(newEdge2)
newEdge2.setMirror(newEdge)
半边镜永远不能为空,并且应该是不可变的,但是我看不出如何在我的代码中传达这种意图。
最佳答案
如果没有看到HalfEdge
的完整定义,这可能不起作用,但请考虑以下因素:
interface HalfEdge {
val mirrorHalf: HalfEdge
}
class HalfEdges {
private inner class First : HalfEdge {
override val mirrorHalf: HalfEdge
get() = second
}
private inner class Second : HalfEdge {
override val mirrorHalf: HalfEdge
get() = first
}
val first: HalfEdge = First()
val second: HalfEdge = Second()
operator fun component1() = first
operator fun component2() = second
}
用法:
val (newEdge, newEdge2) = HalfEdges()
check(newEdge == newEdge2.mirrorHalf)
check(newEdge.mirrorHalf == newEdge2)
您必须同时创建两个半部,尽管您可能永远都不能直接对其进行引用,但两个半边都保留了对整个边缘容器的引用,以便它们可以相互访问。上述实施方式可以容易地适于将数据传递到两个半边缘和/或将数据与整个边缘相关联。
同样的原理也可以通过父“Graph”或“Network”类来实现,该类具有内部双向映射,其边缘相互镜像。
关于kotlin - 循环依赖(Voronoi Halfedge),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41514165/