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

问题描述

| 如果您声明一个继承层次结构,其中父类和子类都具有名称和参数相同的静态方法*,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并且都实现了相同的静态方法。事实并非如此,这两个类都实现了可能完全不同但名称相同的方法。这可能会造成混乱。