Laden...

Vergleichsoperatoren von Enum überladen

Erstellt von steffen_dec vor 9 Jahren Letzter Beitrag vor 9 Jahren 2.355 Views
S
steffen_dec Themenstarter:in
322 Beiträge seit 2007
vor 9 Jahren
Vergleichsoperatoren von Enum überladen

Hallo Zusammen,

ich habe ein Enum:


public enum ETestEnum
{
    Small = 1,
    Middle = 2,
    Big = 3
}

Mit dem Enum kann man ja zwei Werte miteinandere problemlos vergleichen:


ETestEnum e1 = ETestEnum.Small;
ETestEnum e2 = ETestEnum.Middle;
bool bSize = e2 > e1;

Nun wird das Enum erweitert:


public enum ETestEnum
{
    Small = 1,
    Middle = 2,
    Big = 3,
    SmallBigger = 4,
    MiddleBigger = 5
}

Nun möchte ich bei einem Vergleich eine eigene Definition vorgeben, SmallBigger soll zwischen 1 und 2 sein und MiddleBigger zwischen 2 und 3... Beispiel:


ETestEnum e1 = ETestEnum.SmallBigger ;
ETestEnum e2 = ETestEnum.Middle;
bool bSize = e2 > e1;  //hier sollte True rauskommen, in dem Fall ist es aber False da ja bekannterweiser 2(Middle) kleiner ist als 4(SmallBigger). 

Die Indizees dürfen aus Kompatibilitätsgründen nicht verschoben werden (Umwandlung aus gespeicherten INT-Values zu dem Enum und Kompatibilität zu einer anderen Bibliothek). D.h. ich möchste selbst definieren dass SmallBigger größer sein soll als Small und kleiner als Middle... usw.

Gibt es da eine Möglichkeit?

Vielen Dank für Eure Hilfe!

Steffen

211 Beiträge seit 2008
vor 9 Jahren

Finde das irgendwie eigenartig was du vorhast aber soll nichts geben was nicht irgendwer braucht 😃
Comparison operator overloading

*ARGH*: Vollkommen richtig - funktioniert ja nicht weils ein enum ist shameonme

Kontakt & Blog: www.giesswein-apps.at

2.080 Beiträge seit 2012
vor 9 Jahren

Die Operator-Überladung funktioniert nur mit Klassen/Strukturen, bei einem Enum wird das wohl eher nichts.

Einzige Möglichkeit, die ich da sehe, ist, dass du eine Struktur baust, die dann statische Variablen mit den benötigten Werten bereit stellt und dort kannst du dann die Operatoren überladen.
Das Sähe dann ungefähr gleich aus.

Ich sehe aber nicht wirklich, warum zwingend exakt diese Werte verwendet werden müssen?
Wenn das aufsteigende Zustände sein sollen, dann passe doch die Werte der Reihenfolge an?
Wenn du nirgendwo den tatsächlichen Wert als solches im Code stehen hast, sollte das keine Probleme machen.

NuGet Packages im Code auslesen
lock Alternative für async/await

Beim CleanCode zählen nicht die Regeln, sondern dass wir uns mit diesen Regeln befassen, selbst wenn wir sie nicht befolgen - hoffentlich nach reiflichen Überlegungen.

16.842 Beiträge seit 2008
vor 9 Jahren

Die saubere Möglichkeit wären Erweiterungsmethoden alá IsMoreThan, IsLessThan...., sofern man die Werte nicht (mehr) anpassen kann.

P
157 Beiträge seit 2014
vor 9 Jahren

Hallöchen,

also soweit ich weiß, kann man im enum keine Operatoren überladen.

Dein Problem kannst du in mehrfacher Weise lösen, immer davon ausgehend..

Unbequeme Lösung
Schreib dir ne Klasse für den Vergleich und verwende diese an allen Stellen wo es einen Vergleichsoperation für das Enum gibt, sonst bringts nicht viel.

oder : Nicht erfüllbare Anforderung << is immer doof

Saubere Lösung:
Sollten die Werte irgendeiner Stelle gespeichert sein(DB/Datei), aktualisiere diese Werte per Script & Co, dann kannst du dein Enum im Code erweitern. Dürfte wohl ein Problem werden, wenn es noch eine andere Komponente gibt, welche ein gleiches Enum definiert hat, das müsste mit angepasst werden..wenn dort keine Änderungsmöglichkeit besteht:

Was noch zu bedenken ist:

Das Problem dürfte eher die "andere Bibliothek" darstellen, wenn die auf einmal einen neuen Wert ihr Enum übersetzen möchte, kann es gut sein, dass dir, je nach verwendeter Sprache n böser Fehler im die Ohren fliegt, den du nicht unbedingt auflösen kannst.

Mach ein neues Enum und mappe die Werte beim Auslesen auf das Neue. Dann kannst du mit ein paar Handgriffen - insofern das ganze nicht mit Copy Paste häufiger vorkommt - auf das neue Enum umstellen, ohne das Alte anzufassen.

Kleiner Tipp : Bennene das altes Enum um, so dass es den Namen des neuen hat (über F2/oder Refactor-Name), so werden alle Verwendungsstellen gleich mit umbenannt und arbeiten mit dem Neuen. Die Stelle(n) wo der Wert in das Enum umgewandelt wird, musst du entsprechend anpassen, dass die Werte des alten entsprechend gemapped werden, beim speichern wirst du das wohl auch machen müssen.

Lass genug Platz zwischen den Werten(nicht 1,2,3 sonder 10,20,30) für genau solche Erweiterungen, da hast du das nächste mal nicht den selben Ärger.

vg

Wenn's zum weinen nicht reicht, lach drüber!

742 Beiträge seit 2005
vor 9 Jahren

Du kannst Aufzählungen auch anders realisieren: Enumeration classes

S
steffen_dec Themenstarter:in
322 Beiträge seit 2007
vor 9 Jahren

Hallo Zusammen,

danke für die zahlreichen Vorschläge.

Ich habe es nun mit Erweiterungsmethoden gemacht (IsMoreThan, IsLessThan, IsMoreOrEqualThan, IsLessOrEqualThan)... Alles andere wäre zu aufwändig.

Gruß
Steffen