C# 如何在同一类的实例之间共享派生字段?

C# 如何在同一类的实例之间共享派生字段?,c#,xna,sprite,C#,Xna,Sprite,我正在用C#(XNA)编写一个游戏,我不知道怎么做。 下面是我所讲内容的简化版本: class GameObject { Protected Sprite mSprite; Protected string filename; public LoadContent(ContentManager theContentManager)//XNA forces you to load content through a Content Manager which belong

我正在用C#(XNA)编写一个游戏,我不知道怎么做。 下面是我所讲内容的简化版本:

class GameObject
{
    Protected Sprite mSprite;
    Protected string filename;

    public LoadContent(ContentManager theContentManager)//XNA forces you to load content through a Content Manager which belongs to the main game class
    {
    mSprite.Load(theContentManager, filename);//the Sprite class contains a texture and methods to deal with loading images, animating, etc
    }
}

class SomeObject : GameObject
{
    public SomeObject()
    {
    filename = "someobject.png";
    }
}
“SomeObject”的每个实例都有相同的精灵,在启动“SomeObject”后,通过继承的loadContent方法加载该精灵。通常,LoadContent方法在游戏开始时只调用一次

但是,我希望能够在游戏当前运行后添加新对象。如果我能让“SomeObject”的每个实例共享同一个精灵,这样新实例就不必再次加载同一个图像,那就太好了。目前,我只是从现有对象复制精灵,例如。
someObject2.mSprite=someObject1.mSprite
但这仅在存在该类的现有实例可从中复制时有效。我想做的是让mSprite是静态的,但是如果我在基类中将它声明为静态的,那么所有其他对象都将获得相同的sprite,如果我在派生类中声明它,我无法在不将load方法重新写入每个类的情况下想出如何加载图像。
有什么方法可以做到这一点吗?

您可以在基类中创建一个
受保护的抽象属性


每个派生类都可以在静态字段中存储精灵,并从重写属性返回它。

您可以在基类中创建受保护的抽象属性


每个派生类都可以在静态字段中存储一个sprite,并从重写属性返回它。

是否需要此套件?我已经创建了一个所有游戏对象都可以使用的精灵集合,如果指定一个与已创建的精灵同名的精灵,它将使用对已加载精灵的引用,如果是新名称,则加载新精灵

public class GameObject
{
    protected static Dictionary<string, Sprite> sprites = new Dictionary<string, Sprite>();

    protected string fileName;
    protected Sprite sprite;

    public void LoadContent(ContentManager contentManager)
    {
        lock (sprites)
        {
            if (sprites.ContainsKey(fileName))
                sprite = sprites[fileName];
            else
                sprites.Add(fileName, mSprite.Load(theContentManager, filename));
        }
    }

    public GameObject(string fileName)
    {
        this.fileName = fileName;
    }
}
公共类游戏对象
{
受保护的静态字典精灵=新建字典();
受保护的字符串文件名;
受保护的雪碧;
public void LoadContent(ContentManager ContentManager)
{
锁(精灵)
{
if(sprites.ContainsKey(文件名))
精灵=精灵[文件名];
其他的
Add(文件名,mSprite.Load(内容管理器,文件名));
}
}
公共游戏对象(字符串文件名)
{
this.fileName=文件名;
}
}

您需要什么样的套件?我已经创建了一个所有游戏对象都可以使用的精灵集合,如果指定一个与已创建的精灵同名的精灵,它将使用对已加载精灵的引用,如果是新名称,则加载新精灵

public class GameObject
{
    protected static Dictionary<string, Sprite> sprites = new Dictionary<string, Sprite>();

    protected string fileName;
    protected Sprite sprite;

    public void LoadContent(ContentManager contentManager)
    {
        lock (sprites)
        {
            if (sprites.ContainsKey(fileName))
                sprite = sprites[fileName];
            else
                sprites.Add(fileName, mSprite.Load(theContentManager, filename));
        }
    }

    public GameObject(string fileName)
    {
        this.fileName = fileName;
    }
}
公共类游戏对象
{
受保护的静态字典精灵=新建字典();
受保护的字符串文件名;
受保护的雪碧;
public void LoadContent(ContentManager ContentManager)
{
锁(精灵)
{
if(sprites.ContainsKey(文件名))
精灵=精灵[文件名];
其他的
Add(文件名,mSprite.Load(内容管理器,文件名));
}
}
公共游戏对象(字符串文件名)
{
this.fileName=文件名;
}
}

谢谢,这正是我想要的!我以为是这样的,但我记不起抽象关键词,谷歌也帮不了我。事实上,我不确定这是否有效,因为XNA是如何加载图像的。我想我可能把我的班级结构简化得太多了,我会编辑它。谢谢,这正是我想要的!我以为是这样的,但我记不起抽象关键词,谷歌也帮不了我。事实上,我不确定这是否有效,因为XNA是如何加载图像的。我想我可能过于简化了我的班级结构,我会编辑它。