Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

06.07.2014, 23:06

[C#] Enum Problem

Hey liebe Community,

ich hätte da eine Frage und zwar ist wie ist es möglich beispielsweise dem Konstruktor ein System.Enum - Objekt zu übergeben und beim Instanziieren eine frei wählbare Enumeration zu übergeben?

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
public TestClass(System.Enum myEnum)
{
     Enum enum = myEnum;
}

// Usage
public enum Numbers
{
    eins,
    zwei,
    drei
}
TestCLass test = new TestClass(Numbers number);



Ich wäre da über Tipps sehr dankbar :)

Ps Und wenn es nicht mit der Enum klasse geht, ist es anderweitig möglich?? und wenn nicht, bitte bitte Erklärung dazu ^^

Mfg

ProgFrog

Legend

Alter Hase

Beiträge: 731

Beruf: Softwareentwickler

  • Private Nachricht senden

2

06.07.2014, 23:19

Auch wenn ich mich grad eher frag wohin das führen soll, ich denke mit Generics könnte man sowas machen.
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

Netzwerkbibliothek von mir, C#, LGPL: https://sourceforge.net/projects/statetransmitt/

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

3

07.07.2014, 00:20

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
public TestClass(System.Enum myEnum)
{
     Enum enum = myEnum;
}

// Usage
public enum Numbers
{
    eins,
    zwei,
    drei
}
TestCLass test = new TestClass(Numbers number);


Es wurde zwar geschrieben, dass Generik vielleicht eine Möglichkeit sein könnte (und vielleicht würde man es damit auch umsetzen können), allerdings dürfte es recht unsinnig sein, irgendeine Enumeration übergeben zu wollen. Wofür sollte ein Konstrukt gut sein, dem man einerseits eine Enumeration für die Einheiten der Zeit, andererseits aber auch eine Enumeration für alle möglichen Gegnertypen des Spiels übergeben kann?
Vielleicht (/wahrscheinlich) gibt es für die konkrete Problemstellung, die du damit lösen willst, besseres Lösungsmöglichkeiten. (Damit bessere Lösungen vorgeschlagen werden können, sollte aber das eigentliche Problem beschrieben werden und nicht nur nach Hilfe für den derzeitigen Lösungsversuch gefragt werden.)
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

Renegade

Alter Hase

Beiträge: 494

Wohnort: Berlin

Beruf: Certified Unity Developer

  • Private Nachricht senden

4

07.07.2014, 05:15

Nun, prinzipiell ist ein enum ein Object, demnach kannst du es auch wie andere Objects in einer Parameterliste als Argument übergeben. Ebenfalls kannst du den Typ auch bei einer generischen Methode als Typparameter übergeben.

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public enum Test {
    a,
    b,
    c
}

void Main(string[] args) {
    Method(Test.a);
    Method<Test>();
}

void Method(Object enumeration) {
    Console.WriteLine(enumeration.GetType());
}

void Method<T>() {
    Console.WriteLine(typeof(T));
}


Ansonsten, wenn dir das nicht hilft, schildere mal dein Problem. Ich denke, für dein Problem gibt es sicherlich eine bessere Lösungsmöglichkeit.
Liebe Grüße,
René

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

5

07.07.2014, 10:45

Wohl eher: eine Enumeration ist ein Typ und man kann sich eine Instanz von System.Type mit Hilfe des Schlüsselworts/Operators typeof geben lassen.
Da man in der parametrisierten Methode ggf. bereits eine System.Type-Instanz erhält, dürfte man mit GetType() eine Instanz erhalten, die den Typen (/die Klasse) System.Type beschreibt. (Der richtige Typ für den Parameter wäre also einmal Type für einen Aufruf mit typeof und einmal Enum für einen Aufruf mit einem Enumerationswert.)

[Nachtrag:
Mal ganz abgesehen davon, dass man bisher auch einfach "foobar" übergeben könnte... ;)
Der generische Typ müsste dann natürlich auch noch weiter definiert werden.]


Ich bin auf diese Möglichkeit bewusst nicht eingegangen, da man meiner Meinung nach Reflection nur dann verwenden sollte, wenn es nicht anders möglich ist. Sehr wahrscheinlich wird es anders möglich sein, nur fehlen weitere Informationen zum eigentlichen Problem, um andere Möglichkeiten zu nennen.
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Sacaldur« (07.07.2014, 10:52)


6

07.07.2014, 12:11

Mein eigentliches Pproblem war, das ich eine Basisklasse hatte, in der alle verschiedenen Dateiendungen als 5 verschiedene Enumerationstypen festgehalten werden.

Besipiel:


C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
abstract Class BaseClass
{
       proteced BaseClass(Enum Fileextension)
       {
            
       }
}

class SubClass : BaseClass
{
       public SubClass() : base(ImageExtension ext)
       {
            
        }
}

public enum ImageExtension 
{
        png,
        jpeg,
        etc,...
}
}

Legend

Alter Hase

Beiträge: 731

Beruf: Softwareentwickler

  • Private Nachricht senden

7

07.07.2014, 12:16

In diesem Fall ist es wohl komisch wenn du die Enumwerte ohne Bearbeitung an die Basisklasse gibts. Irgendwas wird die Basisklasse doch mit diesen Werten tun wollen?
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

Netzwerkbibliothek von mir, C#, LGPL: https://sourceforge.net/projects/statetransmitt/

8

07.07.2014, 12:24

Ja, also in der Baseclass wollte ich diese Werte im Konstruktor switchen: Wen das dann das, wenn dies dann dies etc..

aber ist das so prinzipiell möglich; denn mein Grundgedanke ist, das jede abgeleitete Klasse seinen speziell für sich benötigten Enumübergeben kann und das dieser dann in der Baseclass verglichen wird und etc, also a' la Polymorphie.

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

9

07.07.2014, 12:33

Zur Unterscheidung verschiedener Dateitypen (Grafik, Video, Text, ...) könnte die Verwendung einer entsprechenden Enumeration ganz sinnvoll sein:

C#-Quelltext

1
2
3
4
5
public enum FileContentTypes {
    Image,
    PlainText
    //...
}
Allerdings kann es sein, dass man hier recht schnell in Situationen gerät, wo man sich nicht eindeutig für einen der vorhandenen Typen entscheiden kann (ist eine GIF einfach nur eine Grafik, ein Video oder ein "Video ohne Ton" (Animation)).
Ob ein solcher Fall auftreten kann, kommt aber auf den jeweiligen Anwendungsfall an.

Die Dateierweiterungen in einer oder mehreren Enumerationen zu halten ist zwar möglich, könnte aber schon eher Probleme bereiten.
Grundsätzlich entscheidet sich der Typ einer Datei nicht anhand der Dateiendung, sondern anhand des Inhalts. Wenn ein ZIP-Archiv (*.zip) als *.txt-Datei gespeichert wird, ist es immernoch ein ZIP-Archiv.
Es wäre zwar grundsätzlich möglich, mehrere Enumerationen zu verwenden, nur kann man an den Stellen, an denen man mit den entsprechenden Werten arbeiten will (sehr wahrscheinlich beim Datei-Handling) nicht auf die unterschiedlichen Typen eingehen.

Sollte man eine einzige Enumeration verwenden, ist das einzige zu überwindende Problem die Zugehörigkeit der Dateiendungen zu den Dateitypen (gebräuchliche Endungen, standardmäßig zu verwendende Endung, ...).
In C# kann man dazu Erweiterungsmethoden verwenden, um der Dateityp-Enumeration entsprechende Methoden anzuhängen. (Diese könnten dann die gewünschten Werte liefern, Prüfungen durchführen etc.)


Anbei: Enumerationen ist eine der wenigen Sachen, die ich in Java besser als in C# finde.
Da in Java intern in eine Klasse (abgeleitet von Enum<E extends Enum<E>>) umgewandelt und für jeden Enumerationswert implizit der entsprechende Konstruktor aufgerufen wird, kann man für jeden Enumerationswert weitere Werte speichern (bspw. eine Auflistung von Zeichenketten, wie hier die Dateierweiterungen) und Methoden definieren.
In C# kann man "nur" Erweiterungsmethoden schreiben und an einer anderen Stelle die mit den Enumerationswerten in Verbindung stehenden Daten (sofern erforderlich) verwalten.
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

10

07.07.2014, 14:10

Statt weiter zu diskutieren, wie er sein enum da rein bekommt, sollte ihm mal jemand sagen, dass das Unfug ist, was er da tun will. Ordentliche Polymorphie würde das Problem ja auch schon lösen, wo für jeden Image-Typ ein eigener Loader existiert. Der Basis-Loader sollte anhand der Extension (oder noch besser anhand des Headers) den richtigen Sub-Loader auswählen und das Bild laden lassen.
Switches im Konstruktor sind ein deutliches Zeichen dafür, dass eine Klasse missbraucht wird etwas zu tun, was eigentlich wohl Aufgabe von mehreren verschiedenen Klassen wäre.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Werbeanzeige