【问题标题】:Scala class inheritanceScala 类继承
【发布时间】:2012-10-02 18:09:50
【问题描述】:

标记为作业。 在尝试实现一个类时,我在面向对象的世界中遇到了麻烦。

我正在实现各种功能来对列表执行操作,我用它来模拟一个集合。 例如,我不太担心如何找到联合的逻辑,但实际上只是结构。

例如:

abstract class parentSet[T] protected () {

    def union(other:parentSet[T]):parentSet[T]

}

现在我想要一个扩展 parentSet 的新类:

class childSet[T] private (l: List[T]) extends parentSet[T] {
    def this() = this(List())
    private val elems = l
    val toList = List[T] => new List(l)

    def union(other:parentSet[T]):childSet[T] = {
        for (i <- this.toList) {
            if (other contains i) {}
            else {l :: i}
        }
        return l
    }
}

在编译时,我收到错误,例如在 def union 中找不到类型 childSet,也没有类型 T 来保持它的参数化。另外,我认为我的 toList 不正确,因为它抱怨它不是对象的成员;仅举几例。

我的语法哪里错了?

编辑

现在我明白了:

  def U(other:parentSet[T]):childSet[T] = {
    var w = other.toList
    for (i <- this.toList) {
        if (!(other contains i)) {w = i::w}
    }
    return new childSet(w)

}

现在,我正在尝试对 map 执行相同的操作,这就是我正在处理/使用的:

def U(other:parentSet[T]):MapSet[T] =  {
    var a = Map[T,Unit]
    for (i <- this.toList) {
        if (!(other contains i)) {a = a + (i->())}
    }
    return new MapSet(elems + (a->()))
  }

我仍然想使用 toList 使其易于遍历,但是在弄乱地图时我仍然遇到类型错误..

【问题讨论】:

    标签: oop class scala inheritance


    【解决方案1】:

    这段代码有几个问题:

    您似乎没有意识到List[T] 是一个不可变 类型,这意味着一旦创建就无法更改它的值。因此,如果您有一个 List[T] 并且您调用 :: 方法来添加一个值,该函数将返回一个新列表并保持您现有的列表不变。 Scala 具有可变集合,例如 ListBuffer,其行为可能更像您的预期。所以当你return l时,你实际上是在返回原始列表。

    另外,您使用:: 的顺序有误。它应该是i :: l,因为:: 是一个右绑定函数(因为它以: 结尾)。

    最后,在你的联合方法中你正在做(other contains i)。也许只是 Scala 语法让你感到困惑,但这与 (other.contains(i)) 相同,显然 contains 不是 parentSet 的定义方法。它是 List[T] 类型上的一个方法,但您没有在列表中调用 contains

    您将此标记为家庭作业,因此我不会修复您的代码,但我认为您应该这样做

    1. 查看一些涉及列表的正确 Scala 代码示例,初学者可以尝试 here

    2. 玩转 Scala REPL 并尝试创建和使用一些列表,这样您就可以了解不可变集合的工作原理。

    【讨论】:

      【解决方案2】:

      要回答您的直接问题,即使 childSet 继承 parentSet 原始方法将 parentSet 指定为返回类型而不是 childSet。您可以仅使用 parentSet 作为类型,也可以将返回类型指定为继承 parentSet 的任何内容。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-12-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-15
        • 2018-06-02
        • 2013-12-15
        相关资源
        最近更新 更多