如果父类和子类有一个同名的静态方法,为什么它被认为是方法隐藏

本文关键字:为什么 认为是 隐藏 方法 静态方法 父类 子类 有一个 如果 | 更新日期: 2023-09-27 17:57:43

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

或者,在类别本身不合格。在任何一种情况下,调用哪种方法都不存在歧义(即,不存在"隐藏")。

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

请注意,我并没有试图为静态继承或任何其他此类无稽之谈创建论点或讨论静态继承。

如果父类和子类有一个同名的静态方法,为什么它被认为是方法隐藏

为什么这种方法被认为是隐藏的?这两个方法都不涉及继承层次结构,只能通过使用类名来调用。

这不是真的。您可以从任何继承的类名调用DoSomething:

public Class A
{
     public static void C() {...}
}
public Class B: A
{
}
B.C() // Valid call!

这就是为什么如果在B.中声明具有相同签名的方法,则隐藏C()

希望这能有所帮助。

如果不明确指示类名,子类的成员将无法从BaseClass访问DoSomething。因此,它对SubClass的成员有效地"隐藏"了,但仍然可以访问。

例如:

public class SubClass : BaseClass
{
    public static void DoSomething()
    {
    }
    public static void DoSomethingElse()
    {
        DoSomething(); // Calls SubClass
        BaseClass.DoSomething(); // Calls BaseClass
    }
}

这只是一个警告。编译器只是想确保您有意使用相同的方法名。

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.DSomething()
SubClass.DSomething();

而且效果很好。问题是,您可能想知道为什么SubClass从BaseClass继承,并且两者都实现了相同的静态方法。事实上,这不是真的,这两个类实现的方法可能完全不同,但名称相同。这可能会让人感到困惑。