是否可以将一个函数/方法与另一个函数/方法相等/重写?

时间:2016-06-16 07:16:17

标签: c# visual-studio-2012

当我在Form1_Load()中调用B()时,是否可以将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文件的类型,并决定是否使用D()覆盖B()(如果其类型为A),否则覆盖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所涉及的一系列方法。

5 个答案:

答案 0 :(得分:0)

你不能这样做:

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

答案 1 :(得分:0)

如果没有这么多方法,您可以使用以下代码完成相同的操作

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

很少注意到你的知识:

您应该使用有意义的变量名称,遵循正确命名naming conventions,这样可以提高代码的可读性以及以后的修改。

答案 2 :(得分: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指向不同的方法,然后在Button3Click上运行B()。

答案 3 :(得分: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; }        
}

答案 4 :(得分:0)

您正在考虑的行为称为First-Class Functions,不幸的是,它不是C#支持的行为,但您仍然可以使用Delegate来执行此操作 - 唯一的问题您是否需要确保始终将默认操作设置为代理(您的代码示例始终会执行此操作)

private Action B;

private void Form1_Load()
{
    B();
}


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

它也与您之前可能使用过的Event Handlers有关。