Ich konnte die Antwort darauf in keiner anderen Frage finden. Angenommen, ich habe eine abstrakte Oberklasse Abstract0 mit zwei Unterklassen, Concrete1 und Concrete1. Ich möchte in der Lage sein, in Abstract0 so etwas wieWie benutze Scala diese Typisierung, abstrakte Typen usw., um einen Selbsttyp zu implementieren?
def setOption(...): Self = {...}
zu definieren, wobei Self der konkrete Untertyp wäre. Dies würde es ermöglichen Anrufe Verkettungs wie diese setOption:
val obj = new Concrete1.setOption(...).setOption(...)
und noch Concrete1 als abgeleitete Art von Objekt zu bekommen.
Was ich will nicht, dies zu definieren:
abstract class Abstract0[T <: Abstract0[T]]
, weil es macht es schwieriger für Kunden diese Art zu behandeln. Ich habe versucht, verschiedene Möglichkeiten, einschließlich einer abstrakten Art:
abstract class Abstract0 {
type Self <: Abstract0
}
class Concrete1 extends Abstract0 {
type Self = Concrete1
}
aber dann ist es unmöglich, setOption zu implementieren, weil this
in Abstract0 nicht Art Selbst haben. Und die Verwendung von this: Self =>
funktioniert auch nicht in Abstract0.
Welche Lösungen gibt es für dieses Problem?
Eine Möglichkeit ist zum Beispiel 'protected def self = this.asInstanceOf [Self]' und dann 'def setOption (...) = {... zu definieren; Selbst} ', aber das sieht ein bisschen hässlich aus ... –