如果父类和子类具有相同名称的静态方法,为什么将其视为隐藏方法?

时间:2011-05-25 14:34:19

标签: c# .net inheritance static

如果声明一个继承层次结构,其中父类和子类都具有相同名称和参数*的静态方法,则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();

或者,在班级本身不合格。在任何一种情况下,都没有关于调用哪种方法的模糊性(即没有'隐藏')。

*有趣的是,这些方法可能因返回类型而不同,但仍会生成相同的警告。但是,如果方法参数类型不同,则不会生成警告。

请注意,我不是要为静态继承或任何其他此类废话创建参数或讨论。

4 个答案:

答案 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并且两者都在实现相同的静态方法。实际上并非如此,两个类都在实现可能完全不同但名称相同的方法。这可能会让人感到困惑。