我想做以下事情
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/