Как использовать эту типизацию, абстрактные типы и т. Д. В Scala для реализации типа Self?

Я не мог найти ответа на этот вопрос ни в одном другом вопросе. Предположим, что у меня есть абстрактный суперкласс 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. При использовании это: Self => также не работает в Abstract0.

Какие есть решения этой проблемы?

44
задан Jean-Philippe Pellet 30 November 2010 в 11:18
поделиться