C#: Alternative zu enum

Gast #5728019
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
Gast #5728165
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.
#5728442
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.
Gast #5729881
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.
Gast #5729941
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
#5737902
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
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren