【发布时间】: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.PI 或 MyClass2.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 继承访问修饰符(即,如果我不修复警告),那段消费者代码会变得混乱、中断或陷入问题。有人可以帮助我理解其中涉及的概念吗?
【问题讨论】:
-
可能是因为
const变量可以同时被类和实例名访问? -
const是静态字段的形式。所以同样的规则也适用于 const 字段。如果你想摆脱警告,只需使用 new 关键字。
标签: c# inheritance static constants