2016-06-16 67 views
0

如果我想在B()在Form1_Load()中調用時替換/覆蓋B()到C()或D(),是否可能?是否有可能相等/重寫一個函數/方法與另一個?

public Prototype() 
    { 
     InitializeComponent(); 
     C(); 
    }   

    private void Form1_Load() 
    { 
     B(); 
    } 

    private void B() 
    { 
     //blank so far 
     //not sure what to put 
    } 

    private void C() 
    { 
     if (RadioButton.Checked == false) 
     { B() == D(); } 
     else 
     { B() == E(); }   
    } 
    private void D() 
    { 
     //something ongoing 
    } 
    private void E() 
    { 
     //something ongoing 
    } 

基本上我需要C()要像教練時Form1_Load的()被調用B(指示),它能夠說Form1_Load的()實際上需要調用d()或E()的情況基地。

我試圖避免太多if..else在每種方法。 基本上,我正在開發一個軟件來接收多種格式的csv源文件,並且Form1_Load()被編碼以執行一組涉及圖表構建和圖表繪製的修復指令。我試圖讓它像軟件的骨架一樣。 C()用於確定已由用戶加載的csv文件的類型,並決定如果其類型A覆蓋B(),否則將B()覆蓋爲E()如果它是類型B. 我需要使用不同的數據集集來顯示csv信息到圖表,並根據csv文件中的內容,我需要設計不同的濾鏡以顯示相關的顯示。

public void I1_ChartTabulate() 
    { 
     Stopwatch timer = new Stopwatch(); 
     timer.Start(); 

     Charting.dataGridView1.DataSource = G_BS_I1; 
     Charting.dataGridView1.AutoGenerateColumns = false; 

     Charting.dataGridView1.Columns[0].Visible = false; 
     Charting.dataGridView1.Columns[1].Visible = true; 
     Charting.dataGridView1.Columns[2].Visible = false; 
     Charting.dataGridView1.Columns[3].Visible = false; 
     Charting.dataGridView1.Columns[4].Visible = false; 
     Charting.dataGridView1.Columns[5].Visible = false; 
     Charting.dataGridView1.Columns[6].Visible = false; 
     Charting.dataGridView1.Columns[7].Visible = false; 
     Charting.dataGridView1.Columns[8].Visible = true; 
     Charting.dataGridView1.Columns[9].Visible = false; 
     Charting.dataGridView1.Columns[10].Visible = false; 
     Charting.dataGridView1.Columns[11].Visible = false; 
     Charting.dataGridView1.Columns[12].Visible = true; 
     Charting.dataGridView1.Columns[13].Visible = false; 
     Charting.dataGridView1.Columns[14].Visible = false; 
     Charting.dataGridView1.Columns[15].Visible = false; 
     Charting.dataGridView1.Columns[16].Visible = false; 
     Charting.dataGridView1.Columns[17].Visible = false; 
     Charting.dataGridView1.Columns[18].Visible = false; 
     Charting.dataGridView1.Columns[19].Visible = false; 
     Charting.dataGridView1.Columns[20].Visible = false; 
     Charting.dataGridView1.Columns[21].Visible = false; 
     Charting.dataGridView1.Columns[22].Visible = false; 
     Charting.dataGridView1.Columns[23].Visible = false; 
     Charting.dataGridView1.Columns[24].Visible = true; 
     Charting.dataGridView1.Columns[25].Visible = false; 
     Charting.dataGridView1.Columns[26].Visible = false; 
     Charting.dataGridView1.Columns[27].Visible = false; 

     timer.Stop(); 
     label62.Text = timer.Elapsed.TotalMilliseconds.ToString("#,##0.00 'milliseconds'"); 
    } 

    public void I2_ChartTabulate() 
    { 
     Stopwatch timer = new Stopwatch(); 
     timer.Start(); 

     Charting.dataGridView2.DataSource = G_BS_I2; 
     Charting.dataGridView2.AutoGenerateColumns = false; 

     Charting.dataGridView2.Columns[0].Visible = false; 
     Charting.dataGridView2.Columns[1].Visible = true; 
     Charting.dataGridView2.Columns[2].Visible = false; 
     Charting.dataGridView2.Columns[3].Visible = false; 
     Charting.dataGridView2.Columns[4].Visible = false; 
     Charting.dataGridView2.Columns[5].Visible = false; 
     Charting.dataGridView2.Columns[6].Visible = false; 
     Charting.dataGridView2.Columns[7].Visible = false; 
     Charting.dataGridView2.Columns[8].Visible = true; 
     Charting.dataGridView2.Columns[9].Visible = false; 
     Charting.dataGridView2.Columns[10].Visible = false; 
     Charting.dataGridView2.Columns[11].Visible = false; 
     Charting.dataGridView2.Columns[12].Visible = true; 
     Charting.dataGridView2.Columns[13].Visible = false; 
     Charting.dataGridView2.Columns[14].Visible = false; 
     Charting.dataGridView2.Columns[15].Visible = false; 
     Charting.dataGridView2.Columns[16].Visible = false; 
     Charting.dataGridView2.Columns[17].Visible = false; 
     Charting.dataGridView2.Columns[18].Visible = false; 
     Charting.dataGridView2.Columns[19].Visible = false; 
     Charting.dataGridView2.Columns[20].Visible = false; 
     Charting.dataGridView2.Columns[21].Visible = false; 
     Charting.dataGridView2.Columns[22].Visible = false; 
     Charting.dataGridView2.Columns[23].Visible = false; 
     Charting.dataGridView2.Columns[24].Visible = true; 
     Charting.dataGridView2.Columns[25].Visible = false; 
     Charting.dataGridView2.Columns[26].Visible = false; 
     Charting.dataGridView2.Columns[27].Visible = false; 

     timer.Stop(); 
     label63.Text = timer.Elapsed.TotalMilliseconds.ToString("#,##0.00 'milliseconds'"); 

    } 

爲了更精確,d()和E()不只是一種方法,它是代表一系列的涉及處理CSV方法。

+0

我認爲這個要求很簡單,而且你正在複雜化一些東西,你能否更清楚一下這個要求?在這個屏幕中如何確定'D()或E()'C();'的目的是什麼 –

+0

我試圖避免在每個方法中有太多if..else。 –

+0

你試圖避免檢查if和else的可能的不同條件是什麼? –

回答

0

難道你不能想:

private void B() 
{ 
    if(RadioButton.Checked == false) c(); 
    else d(); 
} 
0

沒有這麼多的方法,你可以簡單地使用下面的代碼做同樣的,

private void Form1_Load() 
{ 
    if (RadioButton.Checked) 
     SomeMethod_E(); 
    else 
     SomeMethod_D(); 
} 

幾注到您的知識:

您應該使用有意義的變量名稱,遵循正確的命名naming conventions,這可以提高代碼的可讀性以及稍後的修改。

0

這取決於你真正想要/需要的,但一種解決方案是使用委託。 下面是一個簡單的例子:

private VoidDelegate B; 
    delegate void VoidDelegate(); 

    private void Button1Click(object sender, EventArgs e) { 
     B = D; 
    } 

    private void Button2Click(object sender, EventArgs e) { 
     B = E; 
    } 

    private void Button3Click(object sender, EventArgs e) { 
     B(); 
    } 

    private void D() { 
     MessageBox.Show("D"); 
    } 

    private void E() { 
     MessageBox.Show("E"); 
    } 

按按鈕1或2個點B到不同的方法,然後你只運行B()上Button3Click。

0

可以使用delegate這些樣的目的,尤其是Action delegate是適合你的情況:

private Action B; 

private void Form1_Load() 
{ 
    if(B != null) 
    { 
     B(); 
    } 
} 

private void C() 
{ 
    if (RadioButton.Checked == false) 
    { B = D; } 
    else 
    { B = E; }   
} 
0

你想的行爲稱爲First-Class Functions,可惜它不是東西,C#支持,但你可以仍然這樣做使用Delegate - 唯一的缺點是,你需要確保你總是asigning默認操作爲委託(你的代碼示例將永遠做反正)

private Action B; 

private void Form1_Load() 
{ 
    B(); 
} 


private void C() 
{ 
    if (RadioButton.Checked == false) { B = D; } 
    else { B = E; }   
} 

這也與Event Handlers有關,您可能以前使用過這種方法。

相關問題