【问题标题】:Automatically make all child classes call parent's method自动让所有子类调用父类的方法
【发布时间】:2017-08-24 11:36:58
【问题描述】:

我目前正在重构一个大型应用程序。

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

由于代码乱七八糟,我在调试UI的时候不容易顺势而为,也不知道什么时候看的表格。

表单太多了,我无法为每个表单手动创建一个方法,所以我想做的是在父类中创建一个每个人都调用的方法。例如,此方法可以将表单名称打印到控制台。这样我可以在源代码中创建一些文件夹结构,基于什么导致哪里。

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

非常感谢任何输入!

【问题讨论】:

  • 在基类中创建一个方法相当容易:protected sealed void Callme() { /*... yada yada */ } 但是应该在何时何地调用它?
  • 这就是问题所在。有太多子类,我无法将基本表单调用复制+粘贴到每个子类。我需要一个自动化函数或语法,它会强制所有表单在输入时报告其名称。
  • 好吧,我被“输入时”阻止了——你认为“输入”是什么。创建?显示? ...当然你可以在 BaseClass 构造函数中添加一些反射报告,每个后代都会自动调用它......但我想你想要更多的东西在“Form.Show()”被调用的意义上......
  • 或者完全不同:也许外部代码分析工具会有所帮助。有一些工具可以检测和可视化代码依赖关系......只是一个想法。
  • 当进入是一个值得考虑的好事件,谢谢!我已经在使用代码分析工具来可视化依赖关系。现在我想绘制出在用户界面的哪个部分使用了哪些源代码。例如,当我进入设置时,它应该会弹出“您已进入设置表单”。问题是我的表格太多,无法为每个孩子手动创建。希望这是有道理的

标签: c# .net inheritance resharper


【解决方案1】:

如果您还没有覆盖 OnShown 方法,您可以将它放在基本形式中,如下所示:

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

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

【讨论】:

  • 这完美!非常感谢,为我节省了很多时间
【解决方案2】:

据我了解和您所说,如果所有表单都继承自基本表单,那么它们都有共同的组件。所以你可以像下面这样创建一个 Module 并放置这个基本表单的方法。

'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

在children中覆盖baseform的一个方法,用更多的代码调用baseform方法:

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

【讨论】:

  • 感谢您的回答!如果我没有足够清楚地强调这个问题,我深表歉意。表格太多,我无法从所有孩子那里手动调用该方法。因此,我正在寻找允许我创建基本表单方法的功能,然后按几个按钮或使用一些语法来强制所有孩子调用它,而无需我花费数小时将调用复制到每个孩子。
  • 让我看看如果我明白了,您想在所有打开的子表单中调用一个方法,例如,在下午 14 点为所有打开的表单显示一个 msgbox 吗?
  • 关闭!假设我启动应用程序并进入主菜单表单。然后它应该会弹出“您处于主菜单形式”。然后我按设置。它应该会弹出“您现在处于设置表单”等。表格太多了,我无法为每个孩子手动实现,基本上
  • 所以,你真的必须使用一个基本表单,而所有其他人都从那时继承,因为如果你在基本表单中的方法 OnEnter 上实现“欢迎”,它将在子表单中自动调用,并且您不需要在所有孩子中实施“欢迎”。对于子窗体自动调用基本窗体中的方法,它必须在一个动作中,例如,onclick、onload、onclose。如果您想在子项中添加更多代码,只需覆盖调用基本方法的方法,就像我在第一个 aswer 中编辑的那样:
  • 是的,你是对的,这就是我所追求的。我实现了 Jakub Dąbek 提供的代码,如果我理解正确,你的意思是一样的。感谢您的帮助。
猜你喜欢
  • 2016-02-14
  • 1970-01-01
  • 2011-09-04
  • 2012-11-12
  • 2017-11-09
  • 2012-02-22
  • 1970-01-01
  • 2012-06-28
  • 1970-01-01
相关资源
最近更新 更多