覆盖非虚拟属性

时间:2013-11-18 16:00:54

标签: c# inheritance

我知道在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方法,有没有办法做到这一点?

2 个答案:

答案 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。实际上,除了诸如对象工厂或扩展方法容器之类的特殊情况之外,具有大量静态方法通常是糟糕的设计。