我知道,“循环依赖关系是一个错误的设计”,但我认为在这种情况下,这是有必要的。

在构建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/

10-12 01:57