2017-08-24 81 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