Я не мог найти ответ на этот вопрос в любом другом вопросе. Предположим, что у меня есть абстрактный суперкласс Abstract0 с двумя подклассами Concrete1 и Concrete1. Я хочу иметь возможность определить в Abstract0 что-то вродеКак использовать Scala для этой типизации, абстрактные типы и т. Д. Для реализации типа Self?
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
в Абстракт0 не имеют тип Атман. И использование this: Self =>
также не работает в Abstract0.
Какие существуют решения для этой проблемы?
Одним из вариантов является определение, например, `защищенные четкости себя = this.asInstanceOf [Само]`, а затем определение функции SetOption (...) = {...; self} `, но это выглядит немного уродливо ... – 2010-11-30 11:30:07