Como usar a digitação do Scala, tipos abstratos etc. para implementar um tipo Self?

Não consegui encontrar a resposta para isso em nenhuma outra pergunta. Suponha que eu tenha uma superclasse abstrata Abstract0 com duas subclasses, Concrete1 e Concrete1. Eu quero ser capaz de definir no Abstract0 algo como

def setOption(...): Self = {...}

onde Self seria o subtipo concreto. Isso permitiria encadear chamadas para setOption assim:

val obj = new Concrete1.setOption(...).setOption(...)

e ainda obter Concrete1 como o tipo inferido de obj.

O que eu não quero é definir isso:

abstract class Abstract0[T <: Abstract0[T]]

porque torna mais difícil para os clientes lidar com esse tipo. Eu tentei várias possibilidades, incluindo um tipo abstrato:

abstract class Abstract0 {
  type Self <: Abstract0
}

class Concrete1 extends Abstract0 {
  type Self = Concrete1
}

mas é impossível implementar setOption, porquethis em Abstract0 não tem o tipo Self. E usandothis: Self => também não funciona no Abstract0.

Que soluções existem para esse problema?

questionAnswers(2)

yourAnswerToTheQuestion