2010-01-06 84 views
0

在下面的例子中,會發生什麼?C#隱藏成員

class Base { 
    public int abc = 3; 
} 

Class Derived : Base { 
    public int abc = 2; 
} 

static void Main() { 
    Derived blah = new Derived(); 
    Console.WriteLine(blah.abc); 
} 

我敢肯定,你會看到「2」你的控制檯上,但我在讀什麼(看到)反對一切......

爲什麼你會看到「3」,而不是' 2' ?我認爲衍生類的成員'隱藏'基類的相同成員...

回答

0

忽略你的代碼中顯而易見的錯誤:O,你斷言「我確信你會看到'2'控制檯「是正確的,你會和我做的!

你真的應該用戶

class Derived : Base { 
    public new int abc = 2; 
} 

如果隱藏繼承的價值是你的意圖

0

當然你會看到。你爲什麼認爲你會看到3?

但你會得到一個警告:

'Derived.abc' 隱藏繼承成員 'Base.abc'。如果打算使用 隱藏,則使用新關鍵字。

所以,你可以解決它這樣做的:

class Derived : Base { 
    public new int abc = 2; 
} 
9

好了,你有幾個編譯器錯誤,但這裏是根據你的榜樣修正版本。

class Base { 
    public int abc = 3; 
} 

class Derived : Base { 
    public int abc = 2; 
} 

static void Main(string[] args) 
{ 
    Derived foo = new Derived(); 
    Console.WriteLine(foo.abc); 
    Base bar = new Derived(); 
    Console.WriteLine(bar.abc); 
} 

第一行將輸出一個2。第二行將輸出一個3。之所以這樣,是因爲,除非你明確地重寫了一個基類的成員,否則它將只適用於具體類的實例。

在您的派生類中,基本上使用new modifier keyword而不明確使用它。 new關鍵字隱藏了一個基本成員,但是如果具體類被強制轉換爲其基類型,則新屬性不會被使用,並且只有在它再次「強制」到具體類時才能被訪問。

在第二個例子中,Derived類被鑄造爲Base,所以它會使用Baseabc屬性。如果您要使用override keyword,則第二行也會輸出2

編輯:記住記住,爲了允許在Derived類使用override,你需要標記Base.abcvirtual keyword。此外,您不能使fieldsvirtual。您需要使用Properties才能使用virtual關鍵字。儘管如此,你不應該暴露領域,所以這通常不是問題。

+0

打我吧。好答案! – 2010-01-06 20:29:21

+0

嗯,我以爲這年齡以前,但我總是得到: 「錯誤CS0106:修飾符'重寫'不適用於此項」 – Xenoprimate 2010-01-06 20:40:50

+0

您需要添加'虛擬'到基類的屬性,以便使用'覆蓋派生類。 – 2010-01-06 20:58:04