2010-01-07 38 views
0

我試圖執行下面的代碼派生類不能在C#顯示基類變量的值

class A 
{ 
    protected int a; 
    protected char b; 
    public void Show() 
    { 
     a=5; 
     MessageBox.Show(""+a); 
    } 
} 

class B:A 
{ 
    public void Show() 
    { 
     b='z'; 
     MessageBox.Show(""+a+ ""+b); 
    } 
} 

我正在5(的a值)當我做aa.show()輸出其中aa是實例的A但是當我做bb.show(),其中bbB的情況下,輸出出來爲0(的a值)z(的b值)。

有人可以解釋爲什麼派生類無法顯示當前的值,即使它已被聲明爲受保護的,而它能夠顯示正確的值b

更新:

我會盡力的解決方案建議。關於編譯錯誤,沒有,我能夠得到問題中提到的輸出。

+0

你想,一個是== 5與否? 這個問題並不完全正確:*爲什麼派生類無法顯示a *的當前值?派生類**能夠顯示一個值,但是這個**值從未在B類的默認值0中改變**。 – serhio

回答

9

你的B方法隱藏了A方法,你應該得到一個關於這個的編譯器警告。

更好的是如下 - 注意virtual和override關鍵字:

class A 
{ 
    protected int a; 
    protected char b; 
    public virtual void Show() 
    { 
     a=5; 
     MessageBox.Show(""+a); 
    } 
} 
class B:A 
{ 
    public override void Show() 
    { 
     base.Show(); 
     b='z'; 
     MessageBox.Show(""+a+ ""+b); 
    } 
} 

但在這裏,你將有兩個消息框彈出。您需要將A中變量的設置與消息框函數分開,例如在構造函數中設置'a'。

+0

+1提到編譯器警告 – JeffH

+0

不明白提問人甚至不編譯代碼的人......並告訴獲得輸出... – serhio

1

如果您在類A中設置Show()方法的外部值,則會得到您期望的結果。 B.Show的實現隱藏A.Show,所以它永遠不會執行。

2

嘗試以下方法:

class A 
{ 
    protected int a; 
    protected char b; 
    public virtual void Show() 
    { 
     a=5; 
     MessageBox.Show(""+a); 
    } 
} 

class B:A 
{ 
    public override void Show() 
    { 
     b='z'; 
     MessageBox.Show(""+a+ ""+b); 
    } 
} 
0

電流的在bb.show()值是0,所以輸出是正確的。您只能在A類的Show方法中將其設置爲5。

0

您必須在類構造函數或其他方法中初始化值a
Show()B申報類隱藏Show()申明A類,因此方法A類沒有被調用。

閱讀關於C++和C#中多態性和繼承性的更多信息。

E.g.可以用這樣一段代碼的結果感到驚訝:

A aa; 
B bb; 
//... init vars ... 
aa = bb; 
bb.Show(); 
aa.Show(); 
bb.Show(); 

;-)

0

一個= 5;在A.Show方法中設置。

B類永遠不會設置a = 5,因爲它將使用B.Show方法。

問題並不完全正確:爲什麼派生類無法顯示當前值

派生類能夠顯示的值,但是這的值從不在B類改變從默認0。

嘗試也)喜歡初始化顯示(的外:

class A { 
    protected int a = 5; // a = 5 will be visible in B too 
1

您可能已經生成警告這樣的,不是嗎?

警告1 'ConsoleApplication7.B.Show()' 皮繼承的成員 'ConsoleApplication7.A.Show()'。如果隱藏的是 ,則使用 新關鍵字。 C:\ Documents和 設置\ jhoover.ANDT \我 文檔\ Visual Studio的 2005 \項目\ ConsoleApplication7 \ ConsoleApplication7 \的Program.cs 25 21 ConsoleApplication7

正如保羅提到,B.Show藏匿A.顯示()。 Webleeuw的代碼顯示瞭如何通過使用A.Show()虛擬和使用override關鍵字標記B.Show()來實現自己想要的功能。

P.S.不要使用「」 +一個轉換爲字符串,使用a.ToString()

-2

使用模板方法模式http://en.wikipedia.org/wiki/Template_method_pattern

class A 
{ 
protected int a; 

protected virtual string GetForShow() 
{ 
    a = 5; 
    return a.ToString(); 
} 
public void Show() 
{ 
    var forShow = GetForShow(); 
    MessageBox.Show(forShow); 
} 
} 
class B 
{ 
protected char b; 
protected override string GetForShow() 
{ 
    b = 'z'; 
    return base.GetForShow() + b; 
} 
}