我知道在C#中我们无法覆盖非虚拟字段和方法,但我有以下情况:
Class Base
{
public static int a {get;set;}
public static void b()
{
// it uses a
}
public static void c()
{
// it uses a
}
public static string d {get {return a.ToString();}}
}
Class MyClass :Base
{
//...
}
现在在我的班级MyClass
中我想覆盖属性a
,所有Base class
方法和属性都开始使用我实施的覆盖属性,考虑到我不知道无权更改Base class
即使我必须re-implement该属性的getter方法,有没有办法做到这一点?
答案 0 :(得分:3)
这是一个静态属性,因此它以Base.a
的形式使用。无论你做什么,调用代码仍将解析为Base
类,然后解析为静态属性a
。
E.g
//old calling code
Base.a = 7; // does not create an instance
Console.WriteLine(Base.a);
class MyClass :Base
{
public static string a {get; set;}
}
//new calling code
MyClass.a = "some string"; // uses whatever a you defined in MyClass
Console.WriteLine(MyClass.a);
答案 1 :(得分:2)
最好的方法可能是用不同的名称引入一个新属性,或者让你的类包装基类而不是扩展它。与扩展方法一起,这些是构建您无法访问的类的功能的最常用方法。
您也可以使用new
关键字重新引入该属性,但我不建议这样做。它隐藏了基类方法,这很危险,因为代码的用户最终可能会调用错误的东西。在这种情况下,new
是否有保证在很大程度上取决于您的确切用例。
最后请注意,正如Daniel在您对原始帖子的评论中所说,基类中的方法似乎是静态的。因此,即使您拥有基类访问权限,也无法使它们成为virtual
。实际上,除了诸如对象工厂或扩展方法容器之类的特殊情况之外,具有大量静态方法通常是糟糕的设计。