如何实现在trait scala中声明的类中的方法

时间:2013-02-26 18:39:29

标签: scala function traits

运动中有特质,应该实施

trait AbstractSet {
def add(n: Int): AbstractSet
def remove(n: Int): AbstractSet
}

这样的任务 编写一个具体的类MutableSet,它扩展了AbstractSet特性并实现了 特质需要的三种方法。顾名思义,你的班级应该是可变的。那 是,在MutableSet上调用add或remove方法应该修改set的实例 调用该方法,使其现在包含(或不再包含)指定的方法 诠释。 请注意,AbstractSet特征指定add和remove方法必须返回 AbstractSet。在MutableSet的情况下,返回当前集合(this)就足够了。这个 已经在入门代码中为您实现。 (请记住,使用return关键字是 可选的;任何代码块都会自动返回其最后一个表达式。)

我写了这样的代码:

class Set1(ab:List[Int]) extends AbstractSet{
  var a:List[Int]  
  this.a=ab
  **def add(n:Int){
    a.
  }**
}

object Main{
  def main(args: Array[Int]): Unit = {    
    var arr2:List[Int]=List(1,2,4,3)
    val s: AbstractSet = new Set1(arr2)
    s.add(5)
    println(s)
   // s.print
  }
}

但如何在类Set1中实现方法添加?

1 个答案:

答案 0 :(得分:0)

在Scala中,List类是不可变的(参见Scala API Documentation);这意味着每当我们更改List的状态时,我们都希望返回一个反映该更改的新List,而不是更改当前List的状态。

另请注意,如果未明确定义return子句,则Scala中的函数将返回功能块最后一行的值。

转到List文档的链接,然后使用::运算符查看示例。 ::是List(以及许多其他)类的前置运算符。由于列表是单链接的,因此将项目添加到列表的前面而不是结束时效率要高得多。

所以在你的Set1课程中,你可以在你的列表中添加一个Int并简单地返回它:

override def add(n: Int): AbstractSet = new Set1(n :: a)

但是,处理结果列表的方式存在一个小的设计缺陷。正如您在AbstractSet定义中所看到的,add方法返回List。如前所述,列表是不可变的,不会改变。添加后,您需要对返回的List执行某些操作,如下所示:

object Main{
  def main(args: Array[Int]): Unit = {    
    var arr2:List[Int]=List(1,2,4,3)
    val s: AbstractSet = new Set1(arr2)
    val t = s.add(5)
    println(t)
  }
}