代码之家  ›  专栏  ›  技术社区  ›  He11Eventh

具有扩展同一数据结构的多个实现的函数的类。可以做到吗?

  •  1
  • He11Eventh  · 技术社区  · 3 年前

    我在计算机科学课程中学习数据结构。 大学教授给我们分配了一个项目,在这个项目中,我们必须实现从0开始的每个数据结构,而不使用我们选择使用的编程语言已经提供的数据结构。

    所有这些都是通过他的实验室部分考试所必需的:

    • 对于每种数据结构,我们都必须开发多个已知的实现。

       An istance : For the List data structure
                    We have to develop ArrayList, LinkedList and DoubleLinkedList in separate 
                    classes and packages.
      
    • 我们必须遵循已知的正式规范。

       An istance : For the List class
                    We can only declare "data structure releated" members and attributes
                    Like create,delete,head,isEmpty,isLast,next,previous,insert,write,read,remove
      

    我完成了那些,但是

    我需要为每个数据结构将“服务函数”放在一个单独的类/文件中,并且它应该适用于它们的每个类(实现)。

    然后按照上述距离:

    我必须开发一个名为“ListServices”的类/文件,它应该“扩展”每个类,比如: MyArray列表 MyLinkedList MyDoubleLinkedList

    对于服务,我指的是数据结构的“不需要”功能,例如:

    printList() //it prints the whole list

    goToList(position : Int) //goes to the position using Integers

    sortList(whichsort : String, order : String) //whichsort = quicksort,mergesort and order ascending/descending

    purgeList() //it deletes all the "dupled" elements(or the more than 2 occurances per element)

    通常,我会在上面命名的每个类中这样定义它们:

    class MyArrayList<T>{
    .
    .
    .
    fun printList(){}
    }
    
    class MyLinkedList<T>{
    .
    .
    .
    fun printList(){}
    }
    
    class MyDoubleLinkedList<T>{
    .
    .
    .
    fun printList(){}
    }
    
    import edu.uni.lists.MyArrayList as MyList //or whatever other implementation I will interchange instead of MyArrayList
    
    fun main() {
            val l1 = MyList<String> ()
            l1.create() //init
            if(l1.isEmpty())
                println("List is empty")
    
            l1.insert("11",l1.head())
            l1.insert("10",l1.head())
            l1.insert("9",l1.head())
            l1.insert("8",l1.head())
            l1.insert("7",l1.head())
            l1.insert("69",l1.head())
            l1.printList() //should print the whole list
    
    }
    

    无论我使用什么实现,printList()都将只使用数据结构运算符,而不使用其他任何运算符。 printList()的代码对于每个List实现都是相同的。 我不能把服务功能放在那里!

    我需要将printlist()[和其他服务函数]从List实现中“移出”到另一个类或文件中。

    我如何用Kotlin完成此请求?

    谢谢大家。

    附言:我不是英语母语者,如果我不明白你的意思,请随时提问,我会回复的!

    1 回复  |  直到 3 年前
        1
  •  1
  •   Sinner of the System    3 年前

    你应该创建一个 inteface 并将其延伸到你所有的臀部

    interface ListServices {
        fun printList()
    }
    class myArrayList<T> : ListServices {}
    class myLinkedList<T> : ListServices {}
    class myDoubleLinkedList<T> : ListServices {}
    

    或者,如果你不想在这些类之间创建关系,你可以使用 extension functions

    object ListServices {
        fun <T> myArrayList<T>.printList() {}
        fun <T> myLinkedList<T>.printList() {}
        fun <T> myDoubleLinkedList<T>.printList() {}
    }
    

    T 是a type parameter ,必须在函数名称之前声明它。如果你 print 函数不关心此类型,您可以使用 star-projection :

    class myArrayList<T>(var foo: T)
    
    object ListServices {
        fun myArrayList<*>.printList() {
            // here foo type is Any?
        }
    }