Gibt es eine Möglichkeit, eine Sammlung von Alternativen eines gemeinsamen Typ zu definieren:Scala - sich gegenseitig ausschließende Merkmale
trait Mutability
trait Mutable extends Mutability
trait Immutable extends Mutability
und haben den Compiler schließt so etwas wie:
object Hat extends Mutable with Immutable
Ich glaube, ich kann Kraft einige Compiler-Fehler, eine gemeinsame, in Konflikt Element durch, jedoch die Fehlermeldung ist ein bisschen schräg:
trait Mutability
trait Mutable extends Mutability { protected val conflict = true }
trait Immutable extends Mutability { protected val conflict = true }
object Hat extends Mutable with Immutable
<console>:10: error: object Hat inherits conflicting members:
value conflict in class Immutable$class of type Boolean and
value conflict in class Mutable$class of type Boolean
(Note: this can be resolved by declaring an override in object Hat.)
object Hat extends Immutable with Mutable
Gibt es eine direktere Möglichkeit, diese Einschränkung auszudrücken und es nicht jemandem zu erlauben, damit umzugehen, indem man den Hinweis des Compilers nimmt (Override 'Konflikt' in Hat)?
Dank für irgendwelche Einsichten
Welches Ziel erreicht dies? Ich kann mich an keine Zeit erinnern, die ich jemals wollte. – Daenyth
Zuerst, danke für die unten stehenden Ideen, immer noch darüber nachdenkend, ob ich eine luftdichte Lösung bekommen kann (das erlaubt den allzu einfachen Fehler nicht ") MutabilityLevel [Mutability] "Durchrutschen". Zweitens, was das Ziel betrifft. Es gibt zwei Zielebenen: (1) Merkmalsmerkmal, um Handlern zu signalisieren, dass sie Aktualisierungsereignisse für Instanzen dieses Typs nicht sicher handhaben können, und (2) das Veränderbare Merkmal tatsächlich erweitern, um diese Ereignisse zu definieren: Klasse Ereignisse [T <: Veränderbar ] { Fallklasse Hinzufügen (T) Fallklasse Entfernen (T) } zum Beispiel. – jmcnulty
'Klasse Mat (name: String) erstreckt Mutable' ' Klasse-A erweitert Immutable' Handlers sicher davon ausgehen, dass kann 'Objekt PatEvents erstreckt Events [Pat]' kann nicht kompilieren und 'PatEvents.Add/Remove' existieren nicht – jmcnulty