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

标签 c# inheritance static xna abstract

像许多 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/

相关文章:

c# - .NET Core 无法连接到 SQL DB

c# - 如何在 C# 中定义带有抽象参数的 REST 方法

java - 静态类的替代品

java - 在构造函数中初始化静态字段

c# - .net 核心 'Response.Cookies.Append' 不作为某个站工作

c# - 找不到数据表命名空间

c++ - 什么是对象切片?

c# - 返回子类实例的方法

c# - F# 类将接口(interface)实现为私有(private)成员,为什么?

html - maven中的静态html网页