像许多 C# 程序员一样,我最终发现自己需要本质上是静态抽象方法的功能。我完全清楚为什么无法完成它,这是有道理的,但我需要一个解决方法。
我正在开发一个 XNA 游戏,但幸运的是,这个问题并没有涉及太多的 XNA 代码。我有一个抽象基类 Note,以及从它派生的各种子类。在某个时候,我会将它们绘制到屏幕上,所以我必须加载纹理(每个子类都有不同的纹理和不同数量的纹理),让用户输入一个大小参数,将纹理缩放到大小,然后分别遍历我的 List 和 Draw() 。这些纹理非常大,给定子类的每个实例都将使用相同比例大小的相同纹理,直到用户指定不同的大小,因此我采取静态方法的动机。
据我所知,抽象静态方法不可用。我希望能够为每个子类一次(每当用户更改大小参数时)执行单个纹理调整大小,将缩放后的纹理保存为静态 Texture2D 对象,并且每次绘制实例时只引用注释子类型。这样我就可以避免在给定的 Note 派生类的每个实例中都有一个 Texture2D 对象,也可以避免在每个实例中缩放 Texture2D。此外,我希望能够有效地强制执行“Note 的所有具体子类都必须实现此静态方法”。
我不确定什么是最好的方法。我更喜欢一种不需要在每个子类中都有静态方法的方法,例如:
NoteA.LoadScaledTex(scale);
NoteB.LoadScaledTex(scale);
NoteC.LoadScaledTex(scale);
...
foreach(Note n in notes) {..}
但我不确定还有其他优雅的解决方案。
最佳答案
静态实际上并不合适,因为给定的数据片段应该在特定类型的所有实例之间共享。相反(尤其是在这种情况下)您应该使用单例,其中所有实例在内部都引用同一个实例来存储共享数据。通过这种方式,您可以轻松地覆盖各种继承级别的实现,甚至可以让您灵活地让一些派生类型甚至不使用单例。
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);
}
}
}
}
关于c# - C# 中的静态抽象方法(特定用例的替代方法),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3713770/