“MyType” problem: Do I have to use abstract types (or generics) in Scala to return the actual class?

前端 未结 3 852
南旧
南旧 2020-12-08 17:41

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:         


        
3条回答
  •  生来不讨喜
    2020-12-08 18:06

    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)
    }
    

提交回复
热议问题