C#模拟静态类的多态性?

C#模拟静态类的多态性?,c#,xna,xna-4.0,C#,Xna,Xna 4.0,我已经考虑了几天的设计,我几乎100%确定这是一个设计问题。然而,我的困境是:我本质上希望检查编译器和多态静态类。具体来说,我有: static class TileSettings { static class TileOne { public const TileType TYPE = TileType.TileOne; } static class TileTwo { public const TileType TY

我已经考虑了几天的设计,我几乎100%确定这是一个设计问题。然而,我的困境是:我本质上希望检查编译器和多态静态类。具体来说,我有:

static class TileSettings
{
    static class TileOne
    {
        public const TileType TYPE = TileType.TileOne;
    }

    static class TileTwo
    {
        public const TileType TYPE = TileType.TileTwo;
    }
}
这似乎很好,但我希望子类遵循
TileOne
tilewo
可以遵循的契约(如接口),以便在代码中的某个地方可以执行以下操作:

public void function(TileSettings SETTINGS_TO_USE)
{
    someLocalVariable = SETTINGS_TO_USE.TYPE;
}

function(TileOne);
function(TileTwo);

然而,我遇到的一个主要问题是不能将静态类传递到函数中。我所能做的就是创建一个静态类,其中的方法采用TileType并使用开关返回该类型的值。然而,如果它最终被大量调用,那么它似乎效率很低。那么,有什么想法吗?有什么我不知道的简单方法可以解决这个问题吗?提前感谢您的帮助。

是的,答案是:不要使用静态类

这个怎么样:

class TileSettings
{
    public readonly TileType TYPE;

    public static readonly TileSettings TileOne = new TileSettings(TileType.TileOne);
    public static readonly TileSettings TileTwo = new TileSettings(TileType.TileTwo);

    public TileSettings(TileType type)
    {
         TYPE = type;
    }
}
您可以这样使用它:

public void function(TileSettings settings)
{
    someLocalVariable = settings;
}

function(TileSettings.TileOne);
function(TileSettings.TileTwo);

是的,答案是:不要使用静态类

这个怎么样:

class TileSettings
{
    public readonly TileType TYPE;

    public static readonly TileSettings TileOne = new TileSettings(TileType.TileOne);
    public static readonly TileSettings TileTwo = new TileSettings(TileType.TileTwo);

    public TileSettings(TileType type)
    {
         TYPE = type;
    }
}
您可以这样使用它:

public void function(TileSettings settings)
{
    someLocalVariable = settings;
}

function(TileSettings.TileOne);
function(TileSettings.TileTwo);

解决方案是,如果需要多态性,就停止使用静态类。你最初的预感,这是一个设计问题,听起来很准确。如果没有某种从维护/可用性/可读性的角度来看毫无疑问会有问题的黑客攻击,就没有实现这一点的好方法


也许你需要更像单身汉的东西;下面仍然有实例,但通常只引用一个特定实例。

如果需要多态性,解决方案是停止使用静态类。你最初的预感,这是一个设计问题,听起来很准确。如果没有某种从维护/可用性/可读性的角度来看毫无疑问会有问题的黑客攻击,就没有实现这一点的好方法


也许你需要更像单身汉的东西;下面仍然有实例,但通常只引用一个特定实例。

使用。OOP基于对象,而不是静态类。OOP是基于对象的,而不是基于静态类。我想避免阅读中的单例模式,但这非常优雅,效果很好。我做的一个更改是将
TileOne
tilewo
设置为只读,这样它们就不会意外地被更改。有什么理由我不应该这么做吗?编辑-我所说的更改是指
public readonly static
。我调整了代码,我想避免阅读中的单例模式,但这非常优雅,效果很好。我做的一个更改是将
TileOne
tilewo
设置为只读,这样它们就不会意外地被更改。有什么理由我不应该这么做吗?编辑-我所说的更改是指
public readonly static
。我调整了代码。就像我在克里斯乌伊评论中提到的,我想避免使用单例。但是,如果静态类不可行,单例就可以很好地工作。我想我得谨慎一点。谢谢你的帮助。单身更像是一种“反模式”(anti-pattern),所以最好不要太依赖它。然而,与纯静态类相比,它是一个更好的解决方案。正如我在ChrisWue的评论中提到的,我希望避免使用单例。但是,如果静态类不可行,单例就可以很好地工作。我想我得谨慎一点。谢谢你的帮助。单身更像是一种“反模式”(anti-pattern),所以最好不要太依赖它。然而,与纯静态类相比,它是一个优越的解决方案。