簡體   English   中英

如果父子 class 具有同名的 static 方法,為什么會認為方法隱藏?

[英]Why is it considered method hiding if a parent and child class have a static method with the same name?

如果您聲明 inheritance 層次結構,其中父子 class 具有相同名稱和參數的 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.

為什么這個被認為是隱藏的方法? 這兩種方法都不涉及 inheritance 層次結構,只能使用 class 名稱調用:

BaseClass.DoSomething();
SubClass.DoSomething();

或者,class 本身不合格。 在任何一種情況下,調用哪個方法都沒有歧義(即,沒有“隱藏”)。

*有趣的是,這些方法可能因返回類型而異,但仍會產生相同的警告。 但是,如果方法參數類型不同,則不會生成警告。

請注意,我並不是要為 static inheritance 或任何其他此類廢話創建論據或討論。

為什么這個被認為是隱藏的方法? inheritance 層次結構中不涉及這兩種方法,並且只能使用 class 名稱調用。

那不是真的。 您可以從任何繼承的 class 名稱調用 DoSomething:

public Class A
{
     public static void C() {...}
}

public Class B: A
{

}

B.C() // Valid call!

這就是為什么在 B 中聲明具有相同簽名的方法時隱藏 C() 的原因。

希望這可以幫助。

如果不明確指出 class 名稱,子類的成員將無法從 BaseClass 訪問 DoSomething。 所以它實際上對子類的成員“隱藏”,但仍然可以訪問。

例如:

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.DoSomething();
子類.DoSomething();

它工作正常。 事情是你可能想知道為什么 SubClass 繼承自 BaseClass 並且兩者都實現了相同的 static 方法。 實際上這不是真的,兩個類都實現了可能完全不同但名稱相同的方法。 這可能會令人困惑。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM