![](/img/trans.png)
[英]Interface inheritance - hiding method from parent interface - why can I have both methods in the implementing class?
[英]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.