Я не уверен, есть ли лучший способ сделать это:
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»).