2016-03-18 12 views
1

Gibt es eine Superklasse oder ein Merkmal und unter der Annahme einer offenen Hierarchie, wie kann ich erzwingen, dass alle erweiterten Klassen eine bestimmte Typklasse implementieren?Erzwingen Sie, dass alle Unterklassen eine bestimmte Typklasse implementieren

Zum Beispiel die Typklasse unter der Annahme Default

trait Default[T] { def default: T } 

und einige Merkmal Super:

trait Super { } 

Ich möchte erzwingen, dass die folgende (selbst) ist nicht zulässig:

class A(val i: Int) extends Super 

... während das Folgende ist:

Angenommen, das oben Genannte ist möglich, kann ich dann auf den Typ Klassenbeweis für die Subtypen von einer Methode innerhalb Super zugreifen? Das heißt, so etwas wie:

trait Super { 
    def magic: Default[this.type] = ??? 
} 

Antwort

0

Ich glaube kaum, dass erzwingen kann, zumindest auf einfache Art und Weise genug, vielleicht ist es möglich, mit etwas komplexeren wie formlos.

Was ich tun würde, ist, einige Änderungen an der Super-Eigenschaft hinzufügen und einen Selbst Bezug zu nehmen, um Default

trait Default[T] { def default: T } 

trait Super[T] { 
    self: Default[T] => 
} 

class B(val i: Int) extends Super[Int] with Default[Int] { 
    override def default: Int = ??? 
} 

class A(val i: Int) extends Super[Int] // doesn't compile, needs a Default 

Dies sollte auch den zweiten Teil Ihrer Frage lösen, ist der Nachteil, dass jetzt ein Zug ist zum anderen gebündelt.

Verwandte Themen