C#,像方法一样实现“静态抽象”

我最近碰到一个问题,似乎我需要一个“静态抽象”的方法。 我知道为什么这是不可能的,但我怎样才能解决这个限制?

例如,我有一个抽象类,它有一个描述string。 由于这个string对于所有实例都是通用的,所以它被标记为静态的,但是我想要求从这个类派生的所有类都提供它们自己的Description属性,所以我把它标记为抽象的:

abstract class AbstractBase { ... public static abstract string Description{get;} ... } 

当然不会编译。 我想使用接口,但接口可能不包含静态方法签名。

我是否应该简单地使它成为非静态的,并且总是得到一个实例来获得这个类的具体信息?

有任何想法吗?

结合静态和抽象是没有意义的,是的。 静态背后的想法是不需要提供一个类的实例来使用有问题的成员; 然而,在抽象的情况下,我们期望一个实例是一个派生类,它提供了一个具体的实现。

我可以看到为什么你想要这样的组合,但事实是唯一的效果是否认实现使用“this”或任何非静态成员。 也就是说,即使调用抽象或“静态抽象”成员之间没有根本的区别(因为两者都需要一个具体实例来找出使用什么实现),父类将决定派生类的实现中的限制。

你不能。

做这个的地方是属性。

例如

 [Name("FooClass")] class Foo { } 

如果它是静态的,那么只有一个variables的实例,如果我们可以用派生类中的静态variables来完成你想完成的任务,我不会看到inheritance是有意义的。 就个人而言,我认为你要尽量避免一个实例变种。

为什么不只是经典的方式?

 abstract class AbstractBase { protected string _Description = "I am boring abstract default value"; } class Foo : AbstractBase { public Foo() { _Description = "I am foo!"; } } 

如果您不介意推迟实现以明智地实现Description属性,则可以简单地执行

 public abstract string ClassDescription {get; } // ClassDescription is more intention-revealing than Description 

而实现类会做这样的事情:

 static string classDescription="My Description for this class"; override string ClassDescription { get { return classDescription; } } 

然后,你的class级需要遵守描述的合同,但是你要让他们明智地做到这一点。 没有办法以面向对象的方式指定实现(除了通过残酷,脆弱的黑客)。

然而,在我的脑海里,这个描述是类的元数据,所以我更愿意使用别人描述的属性机制。 如果您特别担心多次使用reflection,请创build一个反映您所关注的属性的对象,并在types和描述之间存储字典。 这将最大限度地减lessreflection(除了运行时types检查,这并不是那么糟糕)。 字典可以存储为通常需要此信息的任何类的成员,或者,如果域中的客户端需要,则可以通过单例或上下文对象存储该字典。

如果必须在实例上调用它,则不是静态的。

如果你不是在一个实例上调用它,那么就没有多态性(即就语言而言,ChildA.Description与ChildB.Description完全无关)。

您可以使“抽象”基本方法抛出一个Exception ,所以如果开发人员试图在不重写的情况下在子类上调用此方法,则会“警告”开发人员。

缺点是可能扩展类而不使用这种方法。 然后参考提供的其他答案。