I am not sure if there is a better way of doing this:
trait Animal {
val name: String
val weight: Int
type SubAnimal <: Animal
def updateName(n:
Using type parametrization?
trait Animal[A <: Animal[A]] {
val name: String
val weight: Int
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): A
}
case class Dog(name: String, weight: Int) extends Animal[Dog] {
override def returnMe(n: String, w: Int) = Dog("Dog: " + name, w)
}
case class Cat(name: String, weight: Int) extends Animal[Cat] {
override def returnMe(n: String, w: Int) = Cat("Cat: " + name, w)
}