【发布时间】:2010-10-18 18:35:12
【问题描述】:
我不确定是否有更好的方法:
trait Animal {
val name: String
val weight: Int
type SubAnimal <: Animal
def updateName(n: String) = returnMe(n, this.weight)
def updateWeight(w: Int) = returnMe(this.name, w)
// Abstract protected method
protected def returnMe(n: String, w: Int): SubAnimal
}
case class Dog(name: String, weight: Int) extends Animal {
type SubAnimal = Dog
override def returnMe(n: String, w: Int): Dog = Dog("Dog: " + name, w)
}
case class Cat(name: String, weight: Int) extends Animal {
type SubAnimal = Cat
override def returnMe(n: String, w: Int): Cat = Cat("Cat: " + name, w)
}
val fido = Dog("Fido", 11)
println( fido )
val fido2 = fido.updateWeight(12)
println( fido2 )
当我运行代码时,我得到这个输出:
$ scala animal.scala
Dog(Fido,11)
Dog(Dog: Fido,12)
我想在调用updateName 或updateWeight 后返回相关动物的实际类型(即不是Animal)。我知道如果我直接覆盖updateName和updateWeight,那么会返回正确的类型,我不必使用抽象类型SubAnimal。
对于抽象类型的值与子类相同的特殊情况,是否有一些巧妙的方法来转义抽象类型?
(这被称为“MyType”问题)。
【问题讨论】: