与许多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) {..}
但我不确定任何其他优雅的解决方案。
答案 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
通过这种方式,您拥有NoteAFactory
,NoteBFactory
,NoteCFactory
,这些都来自NoteFactory
,每个人都可以执行不同的LoadScaledText
。< / p>