簡體   English   中英

從其基類調用繼承的方法

[英]Call inherited method from its base class

我有一個抽象類,用於派生許多其他類,每個類做類似但略有不同的東西。 這些類由Reflection加載並向用戶公開,以選擇他需要運行哪一個。

這項工作是因為基類有一個名為Run的抽象方法,它被每個派生類覆蓋。 因此,在我需要任何這些類型的變量的代碼中的任何地方,我都將它們聲明為基類。 然后,當我調用Run方法時,它從真實類型執行方法(即使我將其聲明為基類)。

我的問題是我需要為每個派生類顯示一個自定義的UI。 我想為每個人制作一個自定義的UserControl。 這些控件將有一個puclic方法,它根據用戶對其進行的操作返回一個值。 然后我在運行時創建這個控件,用戶設置需要的東西,我從這個控件調用return方法,最后我可以從用戶選擇的類中將i傳遞給Run Run方法並執行它。

我不知道我有多少個或哪個派生類,因為用戶可以創建從該基類派生的dll並將其作為插件附加。

因此,我認為我必須在表單上創建這些自定義控件作為通用UserControl類,然后將它們作為真實類型轉換。 但有沒有辦法做到這一點只知道控件是從UserControl派生的?

我可以在基類上創建一個公共屬性來存儲它的自定義控件,但是回到主代碼我可以將通用用戶控件轉換為存儲在這個屬性中的類型嗎?

此外,這將是一個設計問題? 我可以使用其他方法來做到這一點嗎?

我希望聽起來不是很混亂:(

我可能誤解了你,但這就是我的想法:

public abstract class BaseClass<T> where T: UserControl, IMyControl
{
    private Page _page;
    protected T Control { get; private set;}

    public BaseClass(Page page, string controlPath)
    {
        _page = page;
        Control = (T)page.LoadControl(controlPath);
        _page.Controls.Add(Control);
    }

    public void Run()
    {
        var data = Control.GetData();
    }
}

public interface IMyControl
{
    object GetData();
}

我會創建一個繼承自UserControl的類。 我不認為你可以使它成為Abstract,但你可以在你的另一個類型上創建一個名為CreateControl()的方法,它將返回應包含UI的UserControl實例。

然后,您可以將UserControl添加到Panel或其他一些容器中,而無需實際關注它是什么特定的UserControl。 如果有特定的方法你想要實現UserControl,比如保存或加載,那么你可以在Base類中添加它們作為虛擬方法,這些方法派生自UserControl。

我不知道這是否是正確的或最佳的解決方案,但基於上述答案和一些研究我這樣解決了問題:

從BaseClass派生的每個類都有一個可覆蓋的方法GetControl。 此方法返回專門為該類設計的UserControl的新實例。

當用戶選擇派生類時,我調用GetControl方法並添加此控件來執行表單。 然后顯示該類的設計UI。 如果選擇另一個類,則刪除此控件,然后為該另一個類創建新UI。

為了讀取用戶在控件中進行的設置,我在每個UserControl上實現了一個名為ReadData的方法。 要從對象級別調用此方法,我使用了反射:

Object ui = FindControlByName("SelectedClassUI");
Type t = ui.GetType();
MethodInfo m = t.GetMethod("ReadData");
Object userSetup = m.Invoke(ui, null);

<... do something with userSetup ...>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM