Tag: 软件设计

Kotlin:排序| 交换操作的位置

我在Kotlin中实现了Quicksort算法。 为此,我使用类型参数和单个函数( sort)创建了一个接口ISort 。 为了排序,我需要交换操作。 我想知道这个交换功能的最佳位置是什么。 我的想法: 1)不幸的是,在Kotlin中,不能使接口功能得到保护。 因此,每个班级都可以在其实施中看到交换,这并不太好(尽管也不算太差,我同意)。 2)把它放在QuickSort实现中更糟,因为可能有几个需要交换功能的ISort接口的实现。 3)我的下一个想法是创建一个单例对象,但Kotlin允许具有类型参数的对象。 这里是接口定义: interface ISort<T> { fun sort(toSort: MutableList<T>): MutableList<T> // 1) Putting swap here has a too high visibility } 这里是QuickSort类的框架: class QuickSort<T> : ISort<T> { override fun sort(toSort: MutableList<T>): MutableList<T> { doQuickSort(toSort) // Internally uses swap return toSort } // 2) Putting swap here […]

从技术的角度来看,混搭性能可以扩展案例类吗?

我多次读到SO,认为案件类不得延长,因为案件类别默认实行平等方式,导致平等的问题。 但是,如果一个特质扩展了一个case类,那么这也是有问题的吗? case class MyCaseClass(string: String) trait MyTrait extends MyCaseClass val myCT = new MyCaseClass("hi") with MyTrait 我想这个问题归结为MyTrait是否只能被混合到MyCaseClass的实例中,或者MyTrait是否继承MyTrait的类成员(字段值和方法),从而覆盖它们。 在第一种情况下,从MyCaseClass继承将是可以的,在后一种情况下,它不会好起来的。 但是哪一个呢? 为了调查,我推进了我的实验 trait MyTrait extends MyCaseClass { def equals(m: MyCaseClass): Boolean = false def equals(m: MyCaseClass with MyTrait): Boolean = false } val myC = new MyCaseClass("hi") myCT.equals(myC) // res0: Boolean = true 让我相信使用MyCaseClass的平等,而不是MyTrait的。 这就意味着一个特质可以扩展一个case类是可以的(尽管一个类不能扩展一个case类)。 但是,我不确定我的实验是否合法。 […]