2010-02-15 16 views
5

Ich schreibe gerade einen Ressourcenmanager für mein Spiel. Dies ist im Grunde eine Klasse, die alle Arten von anderen Objekten unterschiedlichen Typs behandelt, und jedes Objekt wird namentlich genannt (ein System.String). Nun, dies ist meine aktuelle Implementierung, aber da ich ein Wörterbuch von Objekten verwende, muss ich immer noch jedes Objekt umwandeln. Gibt es eine Möglichkeit, Generics in diesem Fall zu verwenden? Ich bin nicht sehr stark bei denen, ich habe versucht, sie zu lesen und es hat mich am Ende mehr verwirrt.Wörterbuch mit Generika

public static class ResourceManager 
{ 
    public static Dictionary<string, object> Resources { get; private set; } 

    public static void LoadResources() 
    { 
     Resources = new Dictionary<string, object>(); 

     //Sample resource loading code 
     Resources.Add("number", 3); 
     Resources.Add("string", "bleh"); 

     Console.Log("Loaded " + Resources.Count + " resources."); 
    } 
} 
+0

Gibt es eine gemeinsame Schnittstelle für die Ressourcen? – moogs

+5

Nicht relevant für die Frage, aber fyi "Ressource" hat nur ein "s". –

+1

In der Tat ist Französisch meine Muttersprache und in Französisch dauert es zwei. Holt mich immer. Genau wie Adresse, nur ein "d" in Französisch. Danke für das Hinzeigen;) –

Antwort

2

Gibt es eine Notwendigkeit, nur eine Gruppe von Ressourcen zu haben, oder können Sie eine für jede Art von Ressource haben?

public class ResourceMap<T> extends Dictionary<string, T> { } 

public static class ResourceManager 
{ 
    public static ResourceMap<Font> Fonts { get; private set; } 
    public static ResourceMap<Image> Images { get; private set; } 
    public static ResourceMap<Sound> Sounds { get; private set; } 

    public static void LoadResources() 
    { 
     Fonts = new ResourceMap<Font>(); 
     Images = new ResourceMap<Image>(); 
     Sounds = new ResourceMap<Sound>(); 

     Fonts.Add("Helvetica", new Font("Helvetica", 12, FontStyle.Regular)); 
     Images.Add("Example", Image.FromFile("example.png")); 
    } 
} 
+0

Nun, in diesem Fall brauche ich nicht wirklich Generika. Die Idee war, nur eine Ressourcenliste zu haben und Generika zu verwenden, um Typcasting zu vermeiden, aber ich denke, ich habe hier etwas verwirrt. –

+0

Nun, Sie könnten die 'ResourceMap'-Klasse ganz vermeiden und einfach' Dictionary' verwenden - vielleicht wäre das doch besser lesbar. Die Frage ist, müssen Sie in der Lage sein, Ressourcen zu greifen, ohne zu wissen, welcher Typ sie sind? Ich kann mir ein solches Szenario nicht vorstellen. –

+0

Nein, ich möchte nur mit einer Eigenschaft/Methode auf die Ressourcen zugreifen können, auch wenn diese Ressourcen unterschiedlichen Typs sein können. –

2

Ich kann mir vorstellen, dass diese Objekte alle mindestens ein paar Dinge gemeinsam haben. Finden Sie diese gemeinsame Basis und verwandeln Sie sie in eine Schnittstelle, die Ihre Objekte implementieren. Verwenden Sie dann eine Dictionary<string, IMyInterface>.

+0

Eigentlich haben diese überhaupt nichts gemeinsam. Die Objekte sind Schriftarten, Bilder und Sounds. Ich würde sie immer noch über eine Schnittstelle umwandeln müssen, weil ich externe Methoden habe, die nur diese Objekte verwenden. –

+0

In diesem Fall möchten Sie etwas erstellen, das überladene Funktionen verwendet, die basierend auf der Typauflösung für die Funktionsaufrufe funktionieren. –

+0

Aber wird das nicht noch Unboxing erfordern, da ich sie immer noch als Objekte speichern werde? –