Negative Flags in C #

8

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.

edit:

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.

    
poke 04.04.2011, 10:13
quelle

4 Antworten

8

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:

%Vor%

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.

    
Kieren Johnstone 04.04.2011, 10:24
quelle
2

Ich würde empfehlen, mit dem zweiten Ansatz zu gehen. Es erscheint mir offensichtlicher und einfacher.

    
Daniel Hilgarth 04.04.2011 10:15
quelle
1
  

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

%Vor%

als (keine spezifische Syntax ...)

%Vor%

Dann werden effektive Stile mit Vererbung als (prevLevelStyle | pos) & ~neg berechnet, was zu folgendem Ergebnis führt:

%Vor%

wie gewünscht.

    
CiaPan 02.05.2011 01:13
quelle
0

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%     
user502144 04.04.2011 10:20
quelle

Tags und Links