2010-10-29 58 views
5

這讓我感到困惑,請將我的行爲暴露給我?c#隱藏混淆

只有在新成員的範圍內,新成員的聲明隱藏了繼承成員。 複印

**class Base 
{ 
    public static void F() {} 
} 
class Derived: Base 
{ 
    new private static void F() {} // Hides Base.F in Derived only 
} 
class MoreDerived: Derived 
{ 
    static void G() { F(); }   // Invokes Base.F 
}** 

在上面的例子,F的Derived中的聲明隱藏從基地繼承在F,但是由於新的F Derived中具有私有訪問,其範圍不擴展到MoreDerived。因此,MoreDerived.G中的調用F()是有效的,並且將調用Base.F.

我不理解的是如何static void G() { F(); }可以訪問基類的方法F時,它可以訪問所有的方法是直接超類和超類隱藏基類的方法F

+0

它不能調用'Derived :: F()',因爲該方法是私有的。在Derived之外,Derived :: F()可能完全不存在。您可能需要稍微改變您的示例,除非這樣做能夠使所有工作都成功 - 在這種情況下,您可以得到答案。 – cHao 2010-10-29 05:50:22

回答

10

MoreDerived無法訪問所有其超級類的方法;特別是它不能訪問private方法。在C#中,類中標記爲private的任何內容對於該類以外的任何內容都是不可見的。換句話說,添加或刪除private方法不會改變該類以外的任何內容編譯的方式。由於new private static void F對外界不可見,因此MoreDerived不受其影響。

如果修飾符是protected而不是MoreDerived看到它。

在您給出的示例中,new關鍵字僅更改名稱空間中名稱的含義。它不會改變可用的方法。的Derived的方法仍然可以調用Base.F()像這樣:

class Derived: Base 
{ 
    new private static void F() 
    { 
     F();  // calls Derived.F() 
     Base.F(); // calls Base.F() 
    } 
} 

class MoreDerived: Derived 
{ 
    static void G() 
    { 
     F();   // Invokes Base.F 
     Derived.F(); // Invokes Base.F because Derived.F is private 
     Base.F(); // Invokes Base.F 
    } 
} 

它類似於下面這個例子:

class Foo 
{ 
    int bar; // in most methods, this variable can be accessed as just "bar" 

    Foo(int bar) // this parameter will hide the instance member bar 
    { 
     this.bar = bar; // instance method can still be accessed, though 
    } 
} 
+0

更快的槍,猜測我不必完成我的段落。 :) +1 – GalacticJello 2010-10-29 05:50:31

+0

沒關係,但如果更多的類可以訪問基類的方法,當它不可用時,它的直接超類只是我的困惑 – NoviceToDotNet 2010-10-29 05:55:38

+0

@NoviceToDotNet:請參閱我的回答以獲得您的上述評論 – TalentTuner 2010-10-29 06:01:35

1

「新」的關鍵字將隱藏基成員如果allowded是在類的外部訪問。

但由於繼承鏈MoreDerived:Derived:Base,您將看到immeditae base的公共成員或鏈中較高的基類。

方法隱藏不等於方法上的專用修飾符。

+0

請參閱隱藏意味着基類方法隱藏在派生類中NEW kwy字的派生類bcas中。現在它不能在外面的世界中獲得。那麼怎麼才能讓moreDerived類這只是我的問題 – NoviceToDotNet 2010-10-29 06:10:56

+0

由於繼承鏈MoreDerived:Derived:Base,所以現在如果你隱藏了base的F方法派生並且使它更私密,所以在更多的被欺騙類中沒有任何公開的它可以在它的直接父級(Derived)中看到,因此它在鏈上爬行並查看是否有其他類有F(),在你的情況下是的,它是Base,因此編譯器使它對你有用。 – TalentTuner 2010-10-29 06:15:56

+0

但是我很疑惑,派生類可以看到它的直接超類,所以如何能更多的派生類可以去基類,請解釋我先生 – NoviceToDotNet 2010-10-29 06:18:42