Kotlin中的抽象构造函数或等效函数

zpf6vheq  于 2023-10-23  发布在  Kotlin
关注(0)|答案(1)|浏览(107)

我有一个抽象的二叉树类与节点的一些代码。我有一个add(value : N)方法和add(value : E),它只接受一个元素并自动创建Node。
正如你在下面看到的,当你创建树的时候,Node是泛型类型的,我想把add(value : E)改为一个非抽象的方法,它将以value : E作为参数调用Node构造函数。

abstract class BinaryTree<E, N : BinaryTree<E,N>.Node>(var rootNode: N? = null) {

    abstract fun add(node : N) : N
    abstract fun add(value : E) : N

    abstract fun remove(value : E) : N?
    abstract fun remove(node : N) : N
    open fun removeAll(value: E): List<N> {
        val removedNodes: MutableList<N> = mutableListOf()
        var removedNode: N?
        while (remove(value).also { removedNode = it } != null) {
            removedNodes.add(removedNode!!)
        }
        return removedNodes
    }

    abstract inner class Node(var data: E, var left: N?, var right: N?){

        constructor(data: E) : this(data, null, null) {}

        open fun isLeaf(): Boolean{
            return (left == null && right == null)
        }
    }
}

我已经研究过是否有类似于抽象构造函数的东西可以强制所有子类实现constructor(value : E),但我不认为这是一件事。
我不确定是否有办法在Kotlin中创建它。我不确定是否有不同的解决方案可以完成同样的事情。
我的问题是,让它抽象是,它消除了实现的可能性,同时让子类有机会进一步成为子类,因为我必须删除泛型Node类型,以便调用该子类的构造器。例如,在这个实现中,BinarySearchTree仍然处理一个泛型Node,它是一个BSTNode,但不是抽象的,所以你不能把它传递给下一个子类:

class BinarySearchTree<E : Comparable<E>, N : BinarySearchTree<E,N>.BSTNode>(rootNode: N? = null) : BinaryTree<E, N>(rootNode) {

    override fun add(value : E): N {
        //This can't happen without a generic Node constructor or removing the generic Node type from my default constructor which limits subclasses.
        //I want to be able to call add(N(E)) where N(E) is whatever N's constructor is
    }

    override fun add(node : N) {}

inner class BSTNode(data: E, val parent: N?, left: N? = null, right: N? = null)
        : BinaryTree<E, N>.Node(data, left, right), Comparable<N> {

    //I want to force this in here
    constructor(data: E) : this(data, null, null, null) {}
aurhwmvo

aurhwmvo1#

节点构造函数可以是树的子类传递给父树类的函数。

abstract class BinaryTree<E, N : BinaryTree<E,N>.Node>(
    var rootNode: N? = null,
    val createNode: (value: E) -> N,
) {

    abstract fun add(node : N) : N
    
    fun add(value : E) : N = add(createNode(value))

    // ...
}

class SomeTreeClass(
    rootNode: N? = null,
) : BinaryTree<MyValue, MyNode>(rootNode, createNode = { MyNode(it) }) {

    // ...

}

相关问题