C#类设计 - 我可以使用什么而不是"静态抽象"?

Rya*_*yan 9 c# design-patterns

我想做以下事情

public abstract class MyAbstractClass
{
    public static abstract int MagicId
    {
        get;
    }

    public static void DoSomeMagic()
    {
        // Need to get the MagicId value defined in the concrete implementation
    }
}

public class MyConcreteClass : MyAbstractClass
{
    public static override int MagicId
    {
        get { return 123; }
    }
}
Run Code Online (Sandbox Code Playgroud)

但是我不能因为你不能拥有静态抽象成员.

我理解为什么我不能这样做 - 对设计的任何建议都能达到同样的效果?

(为了清楚起见 - 我试图提供一个带有抽象基类的库,但是具体的版本必须自己实现一些属性/方法,是的,有充分的理由让它保持静态.)

Jon*_*eet 5

你根本不能DoSomeMagic()当前的设计工作.对MyConcreteClass.DoSomeMagic源代码的调用将被转换为MyAbstractClasss.DoSomeMagicIL.它最初被称为使用的事实MyConcreteClass已经丢失.

您可以考虑使用具有相同方法但是虚拟的并行类层次结构 - 然后将原始类的每个实例与包含先前静态成员的类的实例相关联......并且应该只有一个实例那些.

  • @Ryan:这也是我加入第二段的原因:) (2认同)

小智 4

单例模式也许可行吗?描述如何在 C# 中实现单例的 MSDN 文章的链接:

http://msdn.microsoft.com/en-us/library/ff650316.aspx

在您的特定示例中,Singelton 实例可以扩展一个抽象基类,其中包含您的 MagicId。

只是一个想法 :)