C# 类设计 - 我可以使用什么来代替 "static abstract"?

标签 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; }
    }
}

但是我不能因为你can't have static abstract members .

我明白为什么我不能这样做 - 有没有关于可以达到几乎相同结果的设计的建议?

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

最佳答案

从根本上说,您不能使 DoSomeMagic() 与当前设计一起工作。源代码中对 MyConcreteClass.DoSomeMagic 的调用将被转换为 IL 中的 MyAbstractClasss.DoSomeMagic。它最初是使用 MyConcreteClass 调用的,这一事实已经丢失。

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

关于C# 类设计 - 我可以使用什么来代替 "static abstract"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2899833/

相关文章:

java - 我如何应用 "Factory Pattern"在 Java 中实例化 Firefox、IE 和 Chrome 浏览器实例

c# - 在接口(interface) (API) 项目中引用枚举?

java - 模板作为类名的后缀是什么意思?

java - 寻找设计模式和列表来存储多种类型(对象和整数)

C# 类库 - 单例设计模式

c# - 公开个人资料的可公开查看的 UserId

c# - 在 Windows 服务中模拟用户

c# - IIS 垃圾收集挂起许多应用程序域

c# - 通过事件进行线程更新主屏幕

c# - `ClassA c = new ClassB` 声明可以吗?