标记为家庭作业。 我在尝试实现类时在面向对象的世界中遇到了麻烦。
我正在实现各种函数来对列表执行操作,我用它来模拟集合。 例如,我不太担心如何找到并集的逻辑,但实际上只是结构。
例如:
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
。
您将其标记为家庭作业,因此我不会修复您的代码,但我认为您应该
查看一些涉及列表的正确 Scala 代码示例,尝试 here对于初学者来说
尝试一下 Scala REPL 并尝试创建和使用一些列表,以便您了解不可变集合的工作原理。
关于oop - Scala 类继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12695823/