如果声明一个继承层次结构,其中父类和子类都具有相同名称和参数*的静态方法,则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();
或者,在班级本身不合格。在任何一种情况下,都没有关于调用哪种方法的模糊性(即没有'隐藏')。
*有趣的是,这些方法可能因返回类型而不同,但仍会生成相同的警告。但是,如果方法参数类型不同,则不会生成警告。
请注意,我不是要为静态继承或任何其他此类废话创建参数或讨论。
答案 0 :(得分:3)
为什么这种方法被隐藏了?这两种方法都不涉及继承层次结构,只能通过使用类名来调用。
事实并非如此。您可以从任何继承的类名称调用DoSomething:
public Class A
{
public static void C() {...}
}
public Class B: A
{
}
B.C() // Valid call!
如果您在B中声明具有相同签名的方法,那就是隐藏C()的原因。
希望这有帮助。
答案 1 :(得分:2)
如果没有明确指出类名,SubClass的成员将无法从BaseClass访问DoSomething。所以它对SubClass的成员实际上是“隐藏的”,但仍然可以访问。
例如:
public class SubClass : BaseClass
{
public static void DoSomething()
{
}
public static void DoSomethingElse()
{
DoSomething(); // Calls SubClass
BaseClass.DoSomething(); // Calls BaseClass
}
}
答案 2 :(得分:0)
这只是一个警告。编译器只是想确保您有意使用相同的方法名称。
答案 3 :(得分:0)
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并且两者都在实现相同的静态方法。实际上并非如此,两个类都在实现可能完全不同但名称相同的方法。这可能会让人感到困惑。