Я не мог найти ответ на этот вопрос в любом другом вопросе. Предположим, что у меня есть абстрактный суперкласс Abstract0 с двумя подклассами Concrete1 и Concrete1. Я хочу иметь возможность определять в Abstract0 что-то вроде
def setOption(...): Self = {...}
где Self будет конкретным подтипом. Это позволит цепочки вызовов setOption следующим образом:
val obj = new Concrete1.setOption(...).setOption(...)
и все равно получить Concrete1 как предполагаемый тип obj.
То, что я не хочу, это определить это:
abstract class Abstract0[T <: Abstract0[T]]
потому что это затрудняет обращение клиентов к этому типу. Я пробовал различные возможности, включая абстрактный тип:
abstract class Abstract0 {
type Self <: Abstract0
}
class Concrete1 extends Abstract0 {
type Self = Concrete1
}
но тогда невозможно реализовать setOption, потому что this
в Abstract0 не имеет типа Self. И использование this: Self =>
также не работает в Abstract0.
Какие существуют решения для этой проблемы?