gpt4 book ai didi

c# - C# 中 const 字段的继承修饰符 "new"

转载 作者:行者123 更新时间:2023-11-30 16:46:01 26 4
gpt4 key购买 nike

今天我了解到我们也可以将 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
}
}

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

'MyClass2.PI' hides inherited member 'MyClass1.PI'. Use the new keyword if hiding was intended.

但是如果我不在这里使用 new 继承访问修饰符(即如果我不修复警告).有人可以帮助我理解其中涉及的概念吗?

最佳答案

But what is the piece of consumer code will get confused or break or fall into a problem if I don't use the new inheritance access modifier here (i.e. if I don't fix the warning).

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

关于c# - C# 中 const 字段的继承修饰符 "new",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41084868/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com