2017-08-24 52 views
0

我目前正在重构一个大型应用程序。自动使所有子类调用父类的方法

有大量的Windows窗体,它们都从一个基本窗体继承。我无法调试使用Application.Run()运行第一个窗体后发生的任何事情。

由于代码乱七八糟,我不能在调试UI时轻松地遵循流程,并且不知道我在查看哪种表单。

有太多的表单让我手动为每个方法创建一个方法,所以我想要做的是在父类中创建一个方法,由每个人调用。例如,这个方法可以将表单名称打印到控制台。通过这种方式,我可以在源代码中创建一些文件夹结构,这取决于导致在哪里。

任何建议如何使用Resharper和/或Visual Studio做到这一点?

任何输入是高度赞赏!

+1

在基地创建一个方法相当简单:'protected sealed void Callme(){/ * ... yada yada * /}'但是什么时候该在哪里调用? – Fildor

+0

这就是问题所在。对于我来说,有太多的子类复制+粘贴基本表单调用到每一个。我需要一个自动化的函数或语法来强制所有表单在输入时报告他们的名字。 – Excavator

+1

嗯,我被“进入时”停下 - 你认为“进入”了什么?创建?显示? ...当然,你可以在BaseClass的构造函数中添加一些反射报告,它会被每个后代自动调用...但是我想你需要更多的东西来表示何时调用“Form.Show()”。 – Fildor

回答

1

如果您没有覆盖OnShown的方法,你可以把它放在这样的基本形式:

public /*abstract*/ class BaseForm : Form 
{ 
    protected override void OnShown(EventArgs e) 
    { 
     base.OnShown(e); 
     Console.WriteLine($"Entered {this.GetType().Name}"); 
    } 
} 

当显示任何表单时,它将自动调用,并使用反射将类的名称打印到控制台。

+0

这完美的作品!非常感谢,为我节省了很多时间 – Excavator

0

据我所知,如你所说,如果所有的形式从基本形式继承,他们都有共同的组成部分。所以你可以创建一个像波纹管一样的模块,并把这个基本形式的方法。

'This Module you will put all methods from the base form 

Module ProcAuxiliar 

    Public Sub BaseForm_Sum (ByVal Textbox1 As String, ByVal Textbox2 As String) 
     Dim Val1 As Int32 = Convert.ToInt32(Textbox1) 
     Dim Val2 As Int32 = Convert.ToInt32(Textbox2) 

     MsgBox(Convert.ToString(Val1 + Val2) 

    End Sub 

    Public Sub BaseForm_decrease (ByVal Textbox1 As String, ByVal Textbox2 As String) 
     Dim Val1 As Int32 = Convert.ToInt32(Textbox1) 
     Dim Val2 As Int32 = Convert.ToInt32(Textbox2) 

     MsgBox(Convert.ToString(Val1 - Val2) 

    End Sub 

End Module 

在子窗体只需要调用从模块

'Child Form 1 
    Sub BtSumClick(ByVal sender As Object, ByVal e As EventArgs) Handles btSum.Click 
     ProcAuxiliar.BaseForm_Sum(Textbox1.Text, Textbox2.Text) 
    End Sub 

    'Child Form 2 
    Sub BtDecreaseClick(ByVal sender As Object, ByVal e As EventArgs) Handles BtDecrease.Click 
     ProcAuxiliar.BaseForm_decrease(Textbox1.Text, Textbox2.Text) 
    End Sub 

Overrideing在儿童基本形式的方法,并调用音素表示方法有更多代码的方法:

protected override sub Children_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
     MyBase.Children_Load(sender, e) 


    MyBase.BaseForm_Load(sender, e) 


End Sub 
+0

谢谢你的答案!如果我没有清楚地强调这个问题,我很抱歉。有太多的表格让我手动调用所有孩子的方法。因此,我正在寻找能够创建基本表单方法的功能,然后按几个按钮或使用一些语法,这将强制所有孩子在没有花费数小时的时间将电话复制到每个孩子身上。 – Excavator

+1

让我看看如果我明白了,如果您打算在所有儿童窗体中打开一个方法,例如,在下午14点为所有开放表单显示msgbox,那么您需要调用一个方法吗? –

+0

关闭!比方说,我启动应用程序,它进入主菜单表单。然后它应该弹出“你在主菜单的形式”。然后我按设置。它应该弹出“你现在处于设置形式”等等。有太多的表格供我为每个孩子手动实现,基本上 – Excavator