Forum: PC-Programmierung C#: Alternative zu enum


von Enum (Gast)


Lesenswert?

Hallo!

Habe ein kleines Umsetzungsproblem und hoffe ihr könnte mir helfen.
Ich habe in einem kleinen Tool eine Enumeration definiert, dessen Typ 
als Variable in Klassen und Funktionsparametern verwendet wird.
Nun gibt es eine kleine Änderung und es sind neue Zustände mit dem 
selben wert dazu gekommen. Welcher Zustand zu interpretieren ist, wird 
übergeordnet festgelegt.
Nun ist aber -logischerweise- nicht möglich in einer Enumeration den 
selben Wert mehren Elementen der Enumeration zuzuweisen.
1
public enum Direction
2
{
3
   Forward = 0,
4
   Up = 0,
5
   Backward = 1,
6
   Down = 1,   
7
   Left = 2,
8
   RollLeft = 2,
9
   Right = 3,
10
   RollRight = 3
11
}

Die "Optionen" in zwei enums aufzuteilen ist keine Lösung, da es ja 
weiterhin eine Variable geben soll ("Direction dir").

Gibt es für dieses Dilemma eine Lösung?

Danke & Grüße
Enum

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Enum schrieb:
> Nun gibt es eine kleine Änderung und es sind neue Zustände mit dem
> selben wert dazu gekommen.

Das ist kaputt. So etwas vermeidet man.

Bereits Dein "Enum" ist kaputt, da dort Werte doppelt verwendet werden.

von Framulestigo (Gast)


Lesenswert?

Es gibt doch sicherlich eine zusätzliche Eigenschaft ('mode', oder so), 
die zwischen den neuen und alten Funktionen in Zusammenhang mit 'dir' 
umschaltet?
Entweder kann man dann den enum auf acht Einstellungen aufbohren, die 
dir-Eigenschaft zusammen mit der mode als readonly definieren und die 
wahre Funktion über eine neue Eigenschaft mit setter einstellbar 
gestalten.
Oder man baut die mode-Eigenschaft mit setter dazu, belässt den enum der 
dir-Eigenschaft auf vier Elemente (mit unverfänglicheren Bezeichnungen) 
und dokumentiert die Umschaltung ("In Abhängigkait von 'mode' hat 'dir' 
die folgende Funktion: bla bla"). Mehr als RTFM ist dann für den User 
nicht drin.

von Dirk K. (merciless)


Lesenswert?

Ist die Änderung einmalig oder hast du es jetzt
immer mit 2 "Varianten" des enums zu tun?

Im letzteren Fall würde ich Interface + 2 Klassen
definieren, und zur Laufzeit die korrekte
Implementierung über das Interface benutzen.

merciless

: Bearbeitet durch User
von sven (Gast)


Lesenswert?

Wie wäre es mit einem Dictionary?
https://www.dotnetperls.com/dictionary

Du nimmst die vordefinierten Werte aus dem enum raus und definierst sie 
im Dictionary:
var dictionary = new Dictionary<Direction, int>();

von Cyblord -. (cyblord)


Lesenswert?

Die Lösung ist ein OBJEKT welches den aktuellen Zustand kennt. Man muss 
ihn sinnvoll umschalten  können und es muss den Zustand sinnvoll 
ausgeben können. Überlege dir die Schnittstellen zu diesem Objekt als 
erstes. Dann erst überlegst du dir WIE das Objekt das im inneren genau 
macht.

Ob es dann mit enum + mode Variable arbeitet ist zweitrangig. Du kannst 
diesen inneren Aufbau dann auch jederzeit noch optimieren ohne den Rest 
der Anwendung zu tangieren.

C# ist objektorientiert. Arbeite auch so.

: Bearbeitet durch User
von Hans-Georg L. (h-g-l)


Lesenswert?

In C# gibts doch auch namespaces, dafür sind die da.

von Cyblord -. (cyblord)


Lesenswert?

Hans-Georg L. schrieb:
> In C# gibts doch auch namespaces, dafür sind die da.

Nein. Sicher nicht dafür.

von bluppdidupp (Gast)


Lesenswert?

Mir ist das Problem noch nicht ganz klar.
1
public enum Direction
2
{
3
   Forward = 0,
4
   Up = 0,
5
   Backward = 1,
6
   Down = 1,   
7
   Left = 2,
8
   RollLeft = 2,
9
   Right = 3,
10
   RollRight = 3
11
}
...ist in C# erlaubt (man würde dann allerdings eher noch einen 
[Flags()]-Marker drüber setzen)
1
Direction x = Direction.Up;
2
Debug.WriteLine(x);
3
4
Direction y = Direction.Forward;
5
Debug.WriteLine(y);
würde allerdings vermutlich in beiden Fällen "Up" oder in beiden Fällen 
"Forward" ausgeben.
D.h. wenn man beim auslesen einer Variable mit einem der Direction-Werte 
wieder zwischen z.B. Forward und Up unterscheiden können muss, wären 
enums der falsche (oder nicht ausreichende) Weg.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

bluppdidupp schrieb:
> würde allerdings vermutlich in beiden Fällen "Up" oder in beiden Fällen
> "Forward" ausgeben.

Nein, es gibt 0 aus.

von bluppdidupp (Gast)


Lesenswert?

Forward
Forward
...kommt kurz ausprobiert raus (bei ".net-Framework 4.6.1" als Target in 
der Visual Studio 2017 Community Edition) - Aber ob er da 0 oder einer 
der beiden dazugehörigen Enum-Bezeichner ausgibt, macht für das Problem 
ja ohnehin keinen Unterschied ;D

von Frank O. (fop)


Lesenswert?

Mir fällt da eine grausame Lösung mit Modulo bzw. Und-Verknüpfung ein :
1
public enum Direction:ushort
2
{
3
   Forward = 0,
4
   Up = 256,
5
   Backward = 1,
6
   Down = 257,   
7
   Left = 2,
8
   RollLeft = 258,
9
   Right = 3,
10
   RollRight = 259
11
}
12
13
public void ohweih(Direction wohin)
14
{
15
            switch ((Direction)((ushort)wohin & 255U))
16
            {
17
                case Direction.Forward:
18
                    break;
19
                case Direction.Backward:
20
                    break;
21
                case Direction.Left:
22
                    break;
23
                case Direction.Right:
24
                    break;
25
            }
26
}

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.