继承修饰符" new"对于C#中的const字段

时间:2016-12-11 09:47:21

标签: c# inheritance static const

今天我知道我们也可以将new继承修饰符应用于const字段。我已经将它用于普通的字段和方法,当他们参与继承层次结构时,它们对我来说是完全合理的。我尽力了解这个关键字对const字段的适用性,但是不能。以下是我想到的一些事情:

继承和运行时多态在正常(非静态)类中有意义。 Const字段默认为静态。此外,静态类不支持C#中的继承。

我们说我有两个班级,如下所示:

class MyClass1
{
    public const string PI = "3.14";
}

class MyClass2 : MyClass1
{
    public const string PI = "3.141";   
}

对于外界,他们总是使用ClassName.FieldName语法访问这些类中的常量,例如MyClass1.PIMyClass2.PI。因此,对于外部世界,如果MyClass1和MyClass2通过继承层次结构相关,则无关紧要。 MyClass1.PI提取3.14和MyClass2.PI提取3.141。

如果我在MyClass2的实例方法中,如下所示,该类完全知道他是否正在使用他自己的类的静态成员或他的基类的静态成员。如果他引用基类的静态字段,则使用MyClass1.PI语法。没有什么可以在运行时解决。

class MyClass2 : MyClass1
{
    public const string PI = "3.141";
    string GetValueOfPi()
    {
        return PI;
    }

    string GetValueOfPiFromBaseClass()
    {
        return MyClass2.PI; //It clearly uses the syntax for accessing a static field of its base type
    }
}

因此,我无法弄清{const}字段的new继承修饰符的用法/相关性/重要性。在代码片段#1中,解析器明确地给出了以下警告:

  

' MyClass2.PI'隐藏继承的成员' MyClass1.PI'。使用新的   如果隐藏是关键字的关键字。

但是,如果我不在这里使用new继承访问修饰符(即如果我不修复),那么消费者代码会被混淆或分解或陷入问题警告)。有人可以帮助我理解其中涉及的概念吗?

2 个答案:

答案 0 :(得分:1)

因此,您的派生类有一个const,您希望它具有不同的实现。对于const,只有在使用new关键字时才会发生这种情况。对于方法/属性,您可以在基础中将其定义为虚拟,并在派生类中重写它,或者再次使用new。 new和override都以不同的方式工作,但这不是你问题的一部分:Knowing When to Use Override and New Keywords如果你想知道什么时候使用它。

关于您的警告:如果您没有指定new,则结果输出与您指定new相同,但您也会收到编译器警告(因为您可能不知道)你在基类方法中隐藏了一个方法,只是忘了包含关键字)。

答案 1 :(得分:1)

  

但是如果我不在这里使用新的继承访问修饰符(即如果我不修复警告),那么消费者代码会被混淆或破坏或陷入问题。< / p>

警告告诉您,如果任何代码引用MyClass1.PI,则可能错误地期望使用MyClass2.PI。假设我们将GetValueOfPi移动到基类:

class MyClass1
{
    public const string PI = "3.14";
    public string GetValueOfPi() { return PI; }
}
class MyClass2 : MyClass1
{
    public const string PI = "3.141";
}

现在,new MyClass2().GetValueOfPi()将返回"3.14",而不是"3.141"。从代码中不清楚编写它的人是否打算这样做。通过添加new关键字,您只需告诉编译器&#34;是的,这就是我想要的&#34;。