2016-07-22 73 views
0

我已經在Die類中初始化了一個對象'_currDie',運行了一個if語句將該對象改爲派生類對象,然後運行一個方法。從派生回覆到基類

問題是,當它離開if語句時,它似乎正在恢復到基類。

namespace CharacterSheet 
{ 
public partial class DiceRoller : Form 
{   
    Die _currDie; 
    public DiceRoller() 
    { 
     InitializeComponent(); 
    } 

    private void chooseSides_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     if (chooseSides.SelectedItem.ToString() == "D4") 
     { 
      D4 _currDie = new D4(); 
     } 

     if (chooseSides.SelectedItem.ToString() == "D6") 
     { 
      D6 _currDie = new D6(); 
     } 

     if (chooseSides.SelectedItem.ToString() == "D8") 
     { 
      D8 _currDie = new D8(); 
     } 

     if (chooseSides.SelectedItem.ToString() == "D10") 
     { 
      D10 _currDie = new D10(); 
     } 

     if (chooseSides.SelectedItem.ToString() == "D20") 
     { 
      D20 _currDie = new D20(); 
     } 

     if (chooseSides.SelectedItem.ToString() == "Percentile") 
     { 
      Percentile _currDie = new Percentile(); 
     } 



    } 


    private void Roll_Click(object sender, EventArgs e) 
    { 
     _currDie.Roll(); 
     string currResult = Convert.ToString(_currDie.RollResult); 

     MessageBox.Show(currResult); 

    } 



} 
} 

這是基礎類

namespace CharacterSheet 
{ 
public class Die 
{ 

    public int Sides { get; set; } 

    private Random rng = new Random(); 

    public int rollResult; 

    public int RollResult 
    { 
     get 
     { 
      return rollResult; 
     } 
    } 

    public virtual void Roll() 
    { 
     rollResult = rng.Next(Sides) + 1; 

    } 


} 
} 

,衍生類我一直在

namespace CharacterSheet 
{ 
public class D4:Die 
{ 
    public D4() 
    { 
     Sides = 4; 
    } 

} 
} 

測試我設置爲第一if語句,當我通過一步突破點_currDie.Roll();我可以清楚地看到_currDie從D4對象更改爲Die對象。 在哪一點我得到一個System.NullReferenceException

我試過實例化_currDie沒有定義類,但然後該方法獲取錯誤,因爲沒有Roll對象的方法。

回答

4

在你的每一個if聲明中,你聲明一個新的局部變量,例如,

if (chooseSides.SelectedItem.ToString() == "D4") 
{ 
    D4 _currDie = new D4(); 
} 

初始化新_currDie變量,但你撞塊的結束,所以它也沒用。你想要做的是指定一個新值現有領域:

if (chooseSides.SelectedItem.ToString() == "D4") 
{ 
    _currDie = new D4(); 
} 

注意這裏沒有申報的,因爲你不是要宣佈一個新的變量。你是只是賦值給一個現有的變量。

順便說一句,如果不出意外,你將與一個switch語句更好:

switch (chooseSides.SelectedItem.ToString()) 
{ 
    case "D4": _currDie = new D4(); break; 
    case "D6": _currDie = new D6(); break; 
    case "D20": _currDie = new D20(); break; 
    ... 
} 

我個人做一些事情略有不同,可能有Dictionary<string, Func<Die>>但是這是一個不同的問題。

+0

你輸入得太快我放棄 –

+0

我最初嘗試了一個switch語句,但遇到了類似的異常。現在我知道問題是聲明一個新的局部變量,我會再試一次。謝謝! –

0

要覆蓋你的成員變量_currentDie與範圍內的變量在每個如果...

你在你的類定義_currDie成員,這是確定

public partial class DiceRoller : Form 
{   
    Die _currDie; // define the die member, OK 
    // <SNIP> 

再後來就創建一個新的變量命名__curDie(編譯器必須警告你這個檢查輸出窗口)

// _currDie means this._currdie 
    if (chooseSides.SelectedItem.ToString() == "D20") 
    { 
     D20 _currDie = new D20(); // you create a new variable named _currDie in this scope... 
    } // the scope end so now __curdie means this.__curdie 

修復的方法是相當簡單:

if (chooseSides.SelectedItem.ToString() == "D20") 
    { 
     _currDie = new D20(); // assign the value to the member __curDie 
    }