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似乎有点过分.使用类或方法的类型参数我无法实现自己.
这样的事怎么样?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的第二次更新他的回答到这个问题.