oop - Scala 类继承

标签 oop class scala inheritance

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

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

例如:

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 来使其易于遍历,但在处理 map 时我仍然遇到类型错误..

最佳答案

这段代码有一些问题:

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

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

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

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

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

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

关于oop - Scala 类继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12695823/

相关文章:

php - 模块化设计模式

全局对象中定义的类中的 Javascript 静态方法

scala - Spark历史服务器

scala - 使用在 sqlu 语句中返回什么来返回更新的列,slickexception

python - AttributeError:实例没有属性

c++ - 是否可以强制父类(super class)中的非 const 虚方法优先于子类中同名的 const 方法?

java私有(private)类成员

scala - scala 上的 hadoop 有哪些选项

java - 将两个类链接在一起

c++ - 如何为所有类函数声明一个 SFML 窗口?