Scala抽象类方法,返回一个新的相应类子对象

non*_*com 5 abstract-class scala

我脑子里有以下课程:

abstract class MyClass (data: MyData) {

  def update(): MyClass = {
    new MyClass(process())
  }

  def process(): MyData = {
    ...
  }

}
Run Code Online (Sandbox Code Playgroud)

但是,无法实例化抽象类,因此该行new MyClass(process())是错误的.我的问题是 - 有没有办法告诉编译器,在MyClass的每个子类的情况下,我想创建一个完全该子类的对象?在所有子类中编写此方法awhole似乎有点过分.使用类或方法的类型参数我无法实现自己.

Jea*_*let 6

这样的事怎么样?MyClass使用具体类型进行参数化.当然,所有具体类都必须实现一个实际返回新实例的方法Self.

trait MyClass[+Self <: MyClass[Self]] {
  def update(): Self = {
    makeNew(process())
  }

  def process(): MyData = {
    // ...
  }

  protected def makeNew(data: MyData): Self
}

class Concrete0 extends MyClass[Concrete0] {
  protected def makeNew(data: MyData) = new Concrete0
}

class RefinedConcrete0 extends Concrete0 with MyClass[RefinedConcrete0] {
  override protected def makeNew(data: MyData) = new RefinedConcrete0
}
Run Code Online (Sandbox Code Playgroud)

信用:IttayD的第二次更新他的回答这个问题.