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

Zeus

Frischling

  • »Zeus« ist der Autor dieses Themas

Beiträge: 83

Beruf: Schule

  • Private Nachricht senden

1

09.04.2011, 15:19

Singleton<Derived> in C#

Hey Leute,

Im Moment arbeite ich an einem kleinen C#-Projekt. Im diesem Rahmen benötige ich ein Singleton von dem geerbt werden kann (Damit ich mir die Implimentierung des Singletons bei den Child-Klassen sparen kann). Mein momentaner Ansatz sieht wie folgt aus:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
public class TSingleton<TDerived> 
{ 
private static TDerived instance;
protected TSingleton() { }
public static TDerived Instance() 
{ 
if(instance == null)instance = new TDerived();
return instance; 
} 
}

leider beschwert sich der Compiler das es für TDerived keine "new-Einschränkung" gibt.
Verwenden möchte ich es dann so

C-/C++-Quelltext

1
2
class Test : TSingleton<Test>{} 
Test.Instance();

Über eine Antwort würde ich mich freuen.
Mfg Zeus
Ich würde die Welt gerne verbessern, doch Gott gibt mir den Quellcode nicht!

Sprachen: C,C++/CLI,C#,ASM,PHP,Java(-script) ... fürn Anfang auch genug ...

Mein letztes Projekt:

http://www.youtube.com/watch?v=vU14ewcVaXU

Union_Freedom

Treue Seele

Beiträge: 156

Wohnort: Nähe Hannover

Beruf: Student

  • Private Nachricht senden

2

09.04.2011, 15:42

Hey.

Es wäre interessant wofür du das ganze brauchst. Wenn ich mich jetzt nicht irre, gibt es doch extra für C# das Schlüsselwort static vor einer Klasse, damit die Klasse eben statisch ist und es nur eine Instanz von dieser geben kann. (Die Methoden und Klassenmember müssen dann eben auch static sein)
Kannst du dies für deine Zwecke nicht gebrauchen? (Ich weiß, statische Klassen und auch Singletons sollte man in der Regel vermeiden, wenn es möglich ist)

Für deinen Ansatz :

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
  public class TSingleton<TDerived> where TDerived : new()
    { 
    private static TDerived instance;
    protected TSingleton() { }
    public static TDerived Instance() 
    {
        if (instance == null)
        {
            
            instance = new TDerived();
        }
    return instance; 
    } 
    }


Schau auf die Klassendefinition. Der Hilfsartikel von Microsoft (http://msdn.microsoft.com/query/dev10.qu…CSHARP)&rd=true )

Mit dieser Definition ist sichergestellt, dass TDerived auch einen Konstruktor besitzt. Sonst könntest du ja als Template zum Beispiel int wählen und er würde versuchen ein Konstruktor aufzurufen, was natürlich nicht funktionieren kann.

mfg
Union_Freedom
Coder bei: http://crushing-gods.de/ (Folgt uns)
Erste Eindrücke zu Crushing Gods Link

Zeus

Frischling

  • »Zeus« ist der Autor dieses Themas

Beiträge: 83

Beruf: Schule

  • Private Nachricht senden

3

09.04.2011, 16:06

Das mit dem "where" klappt zwar und er erlaubt mir die Syntax des Singletons aber in Klassen die davon erben muss ich dann den Konstruktor public setzen. Dies ist nicht gerade im Sinne einer Singelton.
Ich benötige das Singleton für ein globales Registry und eine globale StateMachine.

EDIT: Habe es jetzt mit etwas rumprobiern hin bekomen wie ich es möchte :) Das where Schlüsselwort war die richtige Antwort. Ich muss mich da echt mal in die C# spezifischen Sachen einarbeiten.
Danke :) Mfg Zeus
Ich würde die Welt gerne verbessern, doch Gott gibt mir den Quellcode nicht!

Sprachen: C,C++/CLI,C#,ASM,PHP,Java(-script) ... fürn Anfang auch genug ...

Mein letztes Projekt:

http://www.youtube.com/watch?v=vU14ewcVaXU

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

4

09.04.2011, 16:16

Ansonsten ist folgendes Konstrukt in C# oft genutzt als Singleton:

Quellcode

1
2
public class SingletonClass{    public static SingletonClass Instance = new SingletonClass();
    /*your code...*/}



Zugriff:

Quellcode

1
SingletonClass.Instance (....)



;) dadurch sparst du dir den template-vater. ist praktisch, wenn du von einer klasse erben lassen willst, denn es gibt in C# keine mehrfachvererbung.

Union_Freedom

Treue Seele

Beiträge: 156

Wohnort: Nähe Hannover

Beruf: Student

  • Private Nachricht senden

5

09.04.2011, 16:17

Wenn es sich nur um zwei Klassen handelt, so wie ich dich jetzt verstanden habe, kannst du doch ohne großen Bedenken "static" verwenden oder sehe ich das falsch? Dann sind diese zwei Klassen überall verfügbar und die einzelnen States bzw Regetry-Komponenten können sich doch dann via entsprechenden Methoden dort eintragen.

Generell um static oder Singletons zu vermeiden, wäre doch eine Klasse möglich, die als Member zwei Referenzen auf die entsprechenden Objekte der Regestry-Komponente und State-Machine hat. Auf diese Oberklasse speicherst du dann irgendwo eine Referenz und kannst die entsprechenden Klassen verwenden.

Wie gesagt, hängt davon ab was du machen möchtest, man redet nur immer im Allgemeinen davon Singletons und statische Objekte zu umgehen.

Ich kannte das "where" vorher auch nicht. Einfach mal den Compiler-Fehler in der MSDN suchen (ich wollte fast googeln sagen ;) ) und dann werden solche Lösungsvorschläge Einem meistens schon serviert ;)

EDIT: @TrommlBomml

Quellcode

1
2
3
4
public static class SingletonClass
{
//Code
}


Wäre das nicht einfacher als dein Vorschlag? Also wenn es eh sichergestellt ist, dass man nur eine Instanz haben möchte? Natürlich ist diese Möglichkeit auch anwendbar ;)

mfg
Union_Freedom
Coder bei: http://crushing-gods.de/ (Folgt uns)
Erste Eindrücke zu Crushing Gods Link

Zeus

Frischling

  • »Zeus« ist der Autor dieses Themas

Beiträge: 83

Beruf: Schule

  • Private Nachricht senden

6

09.04.2011, 16:35

@TrommlBomml: Du meinst den Ansatz über statische Instanzierung oder ? ... Habe ich auch mit dem Gedanken gespielt. Habe es dann aber wieder vorworfen da es mir, je nach dem wieviele Singleton Klassen noch dazu kommen zu umständlich erscheint jedes mal die Zugriffsfunktion zu implimentieren. Ja über die Tatsache das Mehrfachvererbung nicht geht habe ich mir schon das eine ums andere Mal den Kopf zerbrochen. Da ich ansich in C++-Code und dieses Feature dort gerne verwende (Ich weis es können Fehler auftreten wenn man nicht ordentlich arbeitet) wenn es um die Implimentierung von Dingen wie StateMachines(für KI) geht, wollte ich versuchen hier einen ähnlichen Weg zu gehen.

@Union_Freedom: Irgentwie habe ich mich etwas ungeschickt angestellt. Ich habe das where auch schon im Verdacht gehabt aber für diesen Fall kein Ansatz gefunden wie ich das new erzwingen kann.

Ich werde auf jeden Fall nochmal mit dem static rumexperimentieren ob ich damit zum gewünschten Ergebniss komme. Anderenfalls bleibe ich bei meinem Singleton ... Das hat sich in meinen letzten Projekten als sehr praktisch erwiesen.

Mfg und Danke
Zeus
Ich würde die Welt gerne verbessern, doch Gott gibt mir den Quellcode nicht!

Sprachen: C,C++/CLI,C#,ASM,PHP,Java(-script) ... fürn Anfang auch genug ...

Mein letztes Projekt:

http://www.youtube.com/watch?v=vU14ewcVaXU

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

7

09.04.2011, 16:36

Das Public Static class macht sie sealed. ansonsten kann man es auch weglassen. Du musst sowieso alle Member/Funktionen static deklarieren ;)

Sylence

Community-Fossil

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

8

09.04.2011, 17:10

Jetzt grade wäre der optimale Zeitpunkt sich nochmal zu überlegen, obs denn wirklich ein Singleton sein muss (die Antwort: nein ;))
Singletons sind das gleiche wie globale Variablen...

9

09.04.2011, 17:24

Letztendlich sollte man eine solche Oberklasse für Singletons gar nicht brauchen, weil Singletons nur in den seltensten Fällen wirklich nützlich sind.
Zur Übung ist es aber sicher interessant, ob man so eine Oberklasse überhaupt hinkriegt. Wenn es aber nicht geht, spar dir die Arbeit.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

10

09.04.2011, 23:19

Anderenfalls bleibe ich bei meinem Singleton ... Das hat sich in meinen letzten Projekten als sehr praktisch erwiesen.

Finger weg von Singletons in Deinem Fall. Die Aussage spricht da zu eindeutig, dass das eine schlechte Angewohnheit ist, die mehr Ärger als Nutzen bringt. Vernünftiges Design sollte keine Singletons benutzen, denn das Singleton sollte nur dann verwendet werden, wenn unter unter allen Umständen vermieden werden muss, dass man mehrere Instanzen eines Objekts erzeugen kann. Das ist bei Dir ganz sicher nicht der Fall, das sagt mir das Zitat von oben schon.
Bitte schau Dir andere Konzepte an, Dependency Injection zum Beispiel und Finger weg von Singletons.
Dann hast Du auch Dein aktuelles Problem nicht, dass Du etwas ableiten können willst, was eigentlich gar nicht abgeleitet werden sollte.
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