2017-02-18 1 views
0

Ich würde gerne eine Fallklasse verlangen, um auch mindestens eines von bestimmten Merkmalen zu implementieren.Erfordert eine bestimmte Eigenschaft -> Selbst Typ Annotation?

Ich dachte, ich selbst Typenannotationen wie diese verwenden:

case class DisqualifiedDate(override val paths: Set[DatePath], 
    override val cal: Calendar) extends CalendricDate(paths,cal){ 

    this: DateError => 

    val stringPrefix = "DisqualifiedDate" 
} 

sealed trait DateError 
trait Circular extends DateError 
trait Contradictory extends DateError 
trait Inaccessible extends DateError 

jedoch mit einem mixin Instanziierung nicht kompiliert. Also, wenn ich das tue:

val date = new DisqualifiedDate(Set(datePath),cal) with Circular 

dies kompiliert nicht.

Mache ich etwas falsch oder ist der ganze Ansatz fehlerhaft?

Gelöst: Es funktioniert perfekt mit einer normalen Klasse, d. H. Nicht-Case-Klasse. Ich bin nicht sicher, warum das so ist, aber damit bin ich einverstanden.

+0

Selbst Typ bedeutet eine konkrete Klasse es implementieren müssen. Wollten Sie das DisqualifiedDate später verlängern? Das Wortspiel auf Absicht/Verlängerung war unbeabsichtigt. –

+0

Ich möchte sicherstellen, dass ein DisqualifiedDate auch mindestens eine Art von DateError enthält. Die Eingabe funktioniert also nicht, da muss etwas falsch sein. DateError sollte markieren, was genau hier passiert ist. Es sollte möglich sein, dass ein DisqualifiedDate mehr als einen Fehlertyp hat. Ich möchte das DisqualifiedDate nicht verlängern. –

+0

Wahrscheinlich machen Sie etwas falsch und der Ansatz ist fehlerhaft. "Bear" eine Art von DateError bedeutet, dass info in den Typ oder als ein Begriff (das heißt, ein Mitglied, das sagt, welche DateError) codiert ist. Selbst-Typ bedeutet, dass Sie ein DisqualifiedDate mit Circular usw. haben. –

Antwort

1

Eine eigenständige Fallklasse (d. H. Ohne extends oder Mixins) kann nicht selbst eingegeben werden.

Denken Sie darüber nach. A case class ist sowohl eine Klassendefinition als auch eine Singleton-Instanziierung. Eine Selbsttypreferenz bedeutet, dass die Instanziierung nicht stattfinden kann, ohne dass der angegebene Selbsttyp eingemischt ist.

Sie müssen entweder eine Klassendefinition ohne die automatische Singleton-Erstellung machen oder die erforderliche Eigenschaft in den Fall einmischen Klasse ist definiert.

class DisqualifiedDate(override val paths: Set[DatePath], 
         override val cal: Calendar 
        ) extends CalendricDate(paths,cal) { 
    this: DateError => 
    . . . 

Oder ...

case class DisqualifiedDate(override val paths: Set[DatePath], 
          override val cal: Calendar 
          ) extends CalendricDate(paths,cal) with DateError { 
    this: DateError => // now redundant 
    . . . 
+0

Ihre Lösung scheint korrekt zu sein, und es ist der erste Weg, den ich möchte. Mir war bewusst, dass ich jedes Mal ein Mix machen muss. Genau das wollte ich. Aber es funktioniert nicht mit Fallklassen. –

Verwandte Themen