C#中的静态抽象方法(特定用例的替代方法)

时间:2010-09-14 23:57:04

标签: c# inheritance static xna abstract

与许多C#程序员一样,我最终发现自己需要基本上是静态抽象方法的功能。我完全清楚为什么不能这样做,这是有道理的,但我需要一个解决方法。

我正在开发XNA游戏,但幸运的是,问题并没有涉及太多的XNA代码。我有一个抽象基类Note,以及从中派生的各种子类。在某个时刻,我将把这些绘制到屏幕上,所以我将不得不加载纹理(每个子类将具有不同的纹理和不同的纹理量),让用户输入尺寸参数,将纹理缩放到大小,然后迭代我的List和Draw()每一个。这些纹理非常大,并且给定子类的每个实例将使用相同缩放大小的相同纹理,直到用户指定不同的大小,因此我采取静态方法的动机。

正如我发现的那样,抽象静态方法不可用。我本来希望能够一次为每个子类做一次单独的纹理调整(每当用户更改size参数时),将缩放的纹理保存为静态Texture2D对象,并且每次我绘制一个实例时都会引用Note子类型。这样我就可以避免在给定的Note派生类的每个实例中都有一个Texture2D对象,并且还必须在每个实例中缩放Texture2D。另外,我本来希望能够有效地执行“Note的所有具体子类必须实现这个静态方法”。

我不确定什么是最好的方法。我更喜欢一种方法,不需要在每个子类中都有静态方法,例如:

NoteA.LoadScaledTex(scale);
NoteB.LoadScaledTex(scale);
NoteC.LoadScaledTex(scale);
...
foreach(Note n in notes) {..}

但我不确定任何其他优雅的解决方案。

2 个答案:

答案 0 :(得分:3)

静态实际上并不恰当,因为应该在特定类型的所有实例之间共享给定的数据。而是(在这种情况下尤其如此)您应该使用单例,其中所有实例在内部引用相同的单个实例来存储共享数据。这样,您可以轻松地在各种继承级别覆盖实现,甚至可以让您灵活地使某些派生类型甚至不使用单例。

public abstract class Note
{
    public abstract void LoadScaledTex(scale);
}

public class NoteA : Note
{
    private static ScaledTexData instance;

    public override void LoadScaledTex(scale)
    {
        lock(this.GetType())
        {
            if(instance == null)
            {
                instance = new ScaledTexData(scale);
            }
        }
    }
}

答案 1 :(得分:1)

您需要使用AbstractFactory设计模式: http://www.dofactory.com/Patterns/PatternAbstract.aspx

通过这种方式,您拥有NoteAFactoryNoteBFactoryNoteCFactory,这些都来自NoteFactory,每个人都可以执行不同的LoadScaledText。< / p>