gpt4 book ai didi

Scala:如何在父类(super class)上实现克隆方法,并在子类中使用它?

转载 作者:行者123 更新时间:2023-12-04 14:20:58 27 4
gpt4 key购买 nike

我可能以错误的方式接近这个,但我想要一个这样的对象:

class MyDataStructure {
def myClone = {
val clone = new MyDataStructure
// do stuff to make clone the same as this
...
clone
}
}

class MyDataStructureExtended(val foo: String) extends MyDataStructure

然后:
val data = MyDataStructureExtended
val dataClone = data.clone
println(dataClone.foo)

所以,问题是 dataClone 是 MyDataStructure 类型,而不是我希望的 MyDataStructureExtended 类型。

我想在父类(super class)中添加一个类型 T,子类可以指定(例如它自己),但这似乎不太有希望。

最佳答案

正如您所建议的,抽象类型或泛型参数是您所需要的。您是否要求 MyDataStructure 不是特征或抽象类?下面将 MyDataStructure 定义为一个抽象类,但您也可以将其设为 trait。

abstract class MyDataStructure {
type T
def myClone: T
}

class MyDataStructureExtended(foo: String) extends MyDataStructure {
type T = MyDataStructureExtended
def myClone = new MyDataStructureExtended(foo)
}

Scala 解释器的结果表明,在 MyDataStructureExtended 中定义的 myClone 方法是正确的类型。
scala> val mde = new MyDataStructureExtended("foo")
val mde = new MyDataStructureExtended("foo")
mde: MyDataStructureExtended = MyDataStructureExtended@3ff5d699
scala> val cloned = mde.myClone
val cloned = mde.myClone
cloned: MyDataStructureExtended = MyDataStructureExtended@2e1ed620

您可能希望限制 T 使其类型只能是 MyDataStructure 子类的类型
abstract class MyDataStructure {
type T <: MyDataStructure
def myClone: T
}

我不知道您的要求,但我相信 Scala 2.8 将具有一些很好的功能,包括案例类和命名参数,允许使用复制方法克隆案例类。

关于Scala:如何在父类(super class)上实现克隆方法,并在子类中使用它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2025207/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com