今天我了解到我们可以将
继承和运行时多态在普通(非静态)类中有意义。const字段默认为静态。此外,在C#中,静态类不支持继承。
假设我有两个如下所示的类:
因此,我无法弄清楚
“‘MyClass2.PI’隐藏了继承的成员‘MyClass1.PI’。如果有意隐藏,请使用new关键字。”
但是,如果我不使用
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
}
}
因此,我无法弄清楚
new
继承修饰符对于常量字段的用法/相关性/重要性。在代码段#1中,解析器明确地给出以下警告:“‘MyClass2.PI’隐藏了继承的成员‘MyClass1.PI’。如果有意隐藏,请使用new关键字。”
但是,如果我不使用
new
继承访问修饰符(即如果我不修复警告),消费者代码将会感到困惑、破裂或陷入问题的情况是什么?有人能帮助我理解其中涉及的概念吗?
const
变量可以通过类名和实例名访问? - Ian H.const
是静态字段的一种形式。因此,对于const
字段,同样适用相同的规则。如果您想要消除警告,请使用new
关键字。 - M.kazem Akhgary