如何解决如果父类和子类具有相同名称的静态方法,为什么将其视为方法隐藏?
| 如果您声明一个继承层次结构,其中父类和子类都具有名称和参数相同的静态方法*,Visual Studio将发出警告CS0108: 例:public class BaseClass
{
public static void DoSomething()
{
}
}
public class SubClass : BaseClass
{
public static void DoSomething()
{
}
}
: warning CS0108: \'SubClass.DoSomething()\' hides inherited member \'BaseClass.DoSomething()\'. Use the new keyword if hiding was intended.
为什么将这种方法隐藏起来?继承层次结构均不涉及这两种方法,只能通过使用类名来调用:
BaseClass.DoSomething();
SubClass.DoSomething();
或者,该班级本身不合格。在这两种情况下,都不会模糊调用哪种方法(即,没有“ \'隐藏\”)。
*有趣的是,这些方法可能因返回类型而异,并且仍然会生成相同的警告。但是,如果方法参数类型不同,则不会生成警告。
请注意,我不是要为静态继承创建参数或讨论静态继承或任何其他此类废话。
解决方法
如果未明确指出类名称,则SubClass成员将无法从BaseClass访问DoSomething。因此,它实际上对SubClass成员是“隐藏的”,但仍然可以访问。
例如:
public class SubClass : BaseClass
{
public static void DoSomething()
{
}
public static void DoSomethingElse()
{
DoSomething(); // Calls SubClass
BaseClass.DoSomething(); // Calls BaseClass
}
}
, 为什么将这种方法隐藏起来?继承层次结构均不涉及这两种方法,只能通过使用类名来调用。
那是不对的。您可以从任何继承的类名称调用DoSomething:
public Class A
{
public static void C() {...}
}
public Class B: A
{
}
B.C() // Valid call!
这就是为什么如果在B中声明具有相同签名的方法,则会隐藏C()的原因。
希望这可以帮助。
,这只是一个警告。编译器只想确保您有意使用了相同的方法名称。
,Visual Studio和Philippe都说这是一个警告,因此您的代码将被编译和运行。
但是,\'CodeNaked \'很好地说明了为什么将其隐藏。该代码编译时不会抛出错误或警告。多亏了\'CodeNaked \'
public class BaseClass {
public virtual void DoSomething() {
}
}
public class SubClass : BaseClass {
public override void DoSomething() {
}
public void DoSomethingElse() {
DoSomething(); // Calls SubClass
base.DoSomething(); // Calls BaseClass
}
}
编辑:
使用Travis的代码,我可以执行以下操作:
BaseClass.DoSomething();
SubClass.DoSomething();
而且效果很好。尽管事情可能使您感到奇怪,为什么SubClass继承自BaseClass并且都实现了相同的静态方法。事实并非如此,这两个类都实现了可能完全不同但名称相同的方法。这可能会造成混乱。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。