【问题标题】:inheritance modifier "new" for const fields in C#C# 中 const 字段的继承修饰符“new”
【发布时间】:2016-12-11 09:47:20
【问题描述】:

今天我知道我们也可以将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 继承修饰符的用法/相关性/意义。在代码 sn-p # 1 解析器中清楚地给了我以下警告:

“MyClass2.PI”隐藏继承的成员“MyClass1.PI”。使用新的 如果打算隐藏,则使用关键字。

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

【问题讨论】:

标签: c# inheritance static constants


【解决方案1】:

但是如果我不在这里使用新的继承访问修饰符(即如果我不修复警告),那段消费者代码会变得混乱、中断或陷入问题。

警告告诉您,如果任何代码引用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 关键字,您只是在告诉编译器“是的,这就是我想要的”。

【讨论】:

    【解决方案2】:

    所以你的派生类有一个你想要不同实现的 const。对于 const,只有在使用 new 关键字时才会发生这种情况。对于方法/属性,您可以在基类中将其定义为虚拟,并在派生类中或再次使用 new 覆盖它。 new 和 override 都以不同的方式工作,但这不是您的问题的一部分:Knowing When to Use Override and New Keywords 如果您想了解何时使用它。

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

    【讨论】:

      猜你喜欢
      • 2021-06-10
      • 1970-01-01
      • 2010-11-26
      • 1970-01-01
      • 2016-01-29
      • 2013-09-27
      • 2012-04-26
      • 2017-08-17
      • 1970-01-01
      相关资源
      最近更新 更多