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
你不能这样做.接口,抽象等不能应用于静态成员.如果要完成此任务,则必须手动记住在所有派生类上执行此操作.
此外,静态成员通过派生类继承.如果子类希望指定备用行为,则它们必须隐藏静态父成员.
无论如何,它没有任何意义,因为你无法在不确定类型的情况下访问该静态属性,从而打破了无论如何都要设置接口的重点.
我只是在接口上放置一个属性,并将其路由到静态成员.
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)
但这引出了我的第二个问题 - 你想要完成的是什么?为什么你需要在课堂上有一个静态成员?在给定对象的情况下,您真正想要的是能够确定它具有哪些属性,对吧?那么,为什么你的代码会被静态存储或按实例存储呢?您似乎对合同(您希望能够做什么)与实施(服务提供商如何实现目标)感到困惑.
从 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,则必须提供默认实现。在这种情况下,派生类可以忽略该属性,因为默认实现将始终存在。