如何通过使用接口或抽象来确保类具有静态属性?

pen*_*ake 27 c# static abstract-class overriding interface

我有一个抽象类-let说myBase.我希望从myBase派生的所有类都有一个名为的静态字段

public static List<string> MyPArameterNames 
{
get {return _myParameterNames;} 
}
Run Code Online (Sandbox Code Playgroud)

因此,每个子类都可以告诉它使用哪些参数名称; 我想要静态,因为我不想为此创建一个实例.

我怎样才能做到这一点?

Zac*_*son 27

你不能这样做.接口,抽象等不能应用于静态成员.如果要完成此任务,则必须手动记住在所有派生类上执行此操作.

此外,静态成员通过派生类继承.如果子类希望指定备用行为,则它们必须隐藏静态父成员.

  • "手动记住" - 这就像我们没有电脑或东西 (45认同)
  • 以及当我们使用接口声明该类的对象时(例如在依赖注入的情况下),在那种情况下,我们将无法使用静态变量/属性原因属性在接口中不可用 (2认同)

kyo*_*ryu 7

无论如何,它没有任何意义,因为你无法在不确定类型的情况下访问该静态属性,从而打破了无论如何都要设置接口的重点.

我只是在接口上放置一个属性,并将其路由到静态成员.

public interface IMyInterface
{
    void Foo();
    IList<string> Properties { get; }
}

public class ConcreteClass : IMyInterface
{
    public void Foo(){}
    public IList<string> Properties
    {
        get { return s_properties; }
    }
}
Run Code Online (Sandbox Code Playgroud)

但这引出了我的第二个问题 - 你想要完成的是什么?为什么你需要在课堂上有一个静态成员?在给定对象的情况下,您真正​​想要的是能够确定它具有哪些属性,对吧?那么,为什么你的代码会被静态存储或按实例存储呢?您似乎对合同(您希望能够做什么)与实施(服务提供商如何实现目标)感到困惑.

  • 接口中的公共关键字,rly? (15认同)
  • @sasjaq - 奇怪的是你会发表这样的评论,在给出答案四年后你发现自己在这个问题上......我只能假设是因为你不知道这个问题的答案,这答案传递。 (2认同)
  • @Jack_Hu 奇怪的是,您会在发表评论五年后发表这样的评论......;) (2认同)

Dom*_*eon 5

从 C# 11 开始,您可以按照您的预期进行操作:

public class StaticInterfaceImplementorClass : IStaticInterface
{
    public static int MyStaticProperty { get; set; } = 0;
}

interface IStaticInterface
{
    public static abstract int MyStaticProperty { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

abstract请注意,如果您想强制派生类来实现您的属性,则必须声明该属性。如果您不将其定义为abstract,则必须提供默认实现。在这种情况下,派生类可以忽略该属性,因为默认实现将始终存在。