Hey, gibt es eine Möglichkeit, negative Flags in C # zu speichern? Zum Beispiel habe ich die folgenden Flags, die einige Stile repräsentieren:
%Vor% Jetzt habe ich mehrere Objekte, auf die diese Stile angewendet werden können, und später werden alle verwandten kombiniert (d. h. andere Objekte können einige zuvor festgelegte Stile erben). Außerdem möchte ich negative Flags definieren, die geerbte Stile grundsätzlich rückgängig machen. Wenn also der Stil zuvor auf Styles.Bold | Styles.Italic
gesetzt wurde und das Objekt diesen Stil erbt, aber ein negatives Styles.Bold
-Flag gesetzt ist, sollte das Ergebnis nur Styles.Italic
sein.
Gibt es einen Mechanismus, der das bereits tut? Ich habe jetzt grundsätzlich zwei Möglichkeiten: Erstens definiere NotXY
enum Werte, die dann irgendwie analysiert werden, um die XY
-Werte zu eliminieren, falls gesetzt.
Der andere definiert einfach zwei Felder, positive und negative Flags, wobei die negativen Flags speziell in einem zusätzlichen Feld definiert sind, und ich erhalte die resultierenden Flags, indem ich einfach positiveFlags ^ negativeFlags
mache.
Wenn das nicht klar war, muss ich jeden Stil dieser Zwischenobjekte speichern. So könnte es beispielsweise so sein:
%Vor% Und wenn object3 auch die Werte von 1 und 2 erbt, sollte das Endergebnis nur Italic
sein.
Ein weiteres Beispiel als Antwort auf Kieren Johnstones Frage und nach meiner Aussage im Kommentar, dass negative Werte nur auf der aktuellen Ebene gelten:
%Vor% 2 eliminiert sowohl fett als auch kursiv von vorherigen Objekten, sollte dann aber nicht weiter angewendet werden (positive Werte sollten dies jedoch tun), so dass der endgültige Wert wieder Italic
ist.
Also sollte das Negative immer Vorrang haben? Was passiert, wenn Sie mit NotBold
beginnen und dann Bold
hinzufügen?
Wenn es immer positiv ist, wenn es negativ ist, wenn es vorhanden ist, würde ich zwei Felder vorschlagen:
%Vor% Oder Sie könnten eine Hilfsklasse mit SetStyle
und UnsetStyle
erstellen:
Als Referenz wird positiveFlags ^ negativeFlags
NICHT funktionieren. Betrachten Sie die Situation, in der Bold
nicht gesetzt ist, aber NotBold
ist. Das Ergebnis ist Bold
, obwohl das einzige angegebene Flag NotBold
war.
Wenn Sie etwas kaufmännisches, detailliertes, komplexeres als hier beschreiben und eine erweiterbare / erweiterbare Stilvererbung wünschen, sollten Sie es schließlich mit einem Objektdiagramm / Klassenhierarchie richtig entwerfen - beginnen Sie mit der Definition Eine Style
-Klasse mit einem oder mehreren übergeordneten Objekten. Jedes Style
könnte eine Gruppe von Eigenschaft name / value-Paaren haben, die alles vom übergeordneten überschreiben - es könnte eine Properties
-Auflistung geben, die diese Überschreibungen zurückgibt, und eine Evaluate
-Methode, die am Stammobjekt beginnt und zum Stil in Frage, Erstellen einer resultierenden Liste von Eigenschaften für Sie zu verwenden.
Ich hoffe, das hilft.
Ich würde empfehlen, mit dem zweiten Ansatz zu gehen. Es erscheint mir offensichtlicher und einfacher.
Der andere definiert einfach zwei Felder, positive und negative Flags, wobei die negativen Flags speziell in einem zusätzlichen Feld definiert sind, und ich erhalte die resultierenden Flags, indem ich einfach
positiveFlags ^ negativeFlags
mache.
Das erscheint mir am natürlichsten (außer dem Ausdruck% positiveFlags & ~negativeFlags
lesen). Außerdem führt es zu einer einfachen Methode, geerbte Stile anzuwenden. Wenn wir dein Beispiel umschreiben
als (keine spezifische Syntax ...)
%Vor% Dann werden effektive Stile mit Vererbung als (prevLevelStyle | pos) & ~neg
berechnet, was zu folgendem Ergebnis führt:
wie gewünscht.
Wenn ich mich nicht irre, müssen Sie keine negativen Flags definieren, sondern "positive" Flags verwenden, um sie zu deaktivieren.
Dieser Code kann beispielsweise zum Deaktivieren des Bold-Flags
verwendet werden %Vor%