2010-02-15 35 views
5

我目前正在为我的游戏写一篇资源管理器。这基本上是一个类,它将处理各种不同类型的其他对象,并且每个对象都通过名称引用(System.String)。现在这是我当前的实现,但由于我使用的是对象字典,我仍然需要投射每个对象。在这种情况下是否有使用泛型的方法?我在这些方面并不是很强大,我试着阅读它们,结果让我更加困惑。使用泛型的字典

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

是否有一个通用的资源接口? – moogs 2010-02-15 02:01:53

+5

与问题无关,但fyi“资源”只有一个“s”。 – 2010-02-15 02:03:14

+1

事实上,法语是我的母语,法语是两种。永远得到我。就像地址一样,法语只有一个'd'。感谢您指出这一点;) – 2010-02-15 02:34:54

回答

2

是否需要只有一组资源,或者每种资源都可以有一组资源?

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

那么在这种情况下,我并不需要仿制药。这个想法是只有一个资源列表,并使用泛型来避免类型转换,但我认为我在这里弄糊涂了。 – 2010-02-15 03:53:48

+0

那么,你可以完全避免使用'ResourceMap'类,只需使用'Dictionary' - 可能毕竟这会更具可读性。问题是,你需要能够获取资源而不知道它们是哪种类型?我无法亲自想到这种情况。 – 2010-02-15 14:49:32

+0

不,我想要做的就是只能使用一个属性/方法来访问资源,尽管这些资源可以是不同的类型。 – 2010-02-15 20:04:07

2

我想象那些对象至少有一些共同的东西。找到共同点并将其变为您的对象实现的界面。然后使用Dictionary<string, IMyInterface>

+0

其实,这些没有任何共同之处。对象是字体,图像和声音。我仍然需要使用一个接口来施放它们,因为我有只使用这些对象的外部方法。 – 2010-02-15 02:14:11

+0

在这种情况下,您希望构建一些使用重载函数的功能,这些函数将根据函数调用的类型解析进行工作。 – 2010-02-15 02:16:12

+0

但是,仍然不需要拆箱,因为我仍然将它们存储为对象? – 2010-02-15 02:36:04