在静态方法中创建模板方法

本文关键字:模板方法 创建 静态方法 | 更新日期: 2023-09-27 18:35:39

我创建了一个只有一个方法的类InputBox,它是静态的:
Public static Show(string i_Prompt)

此方法创建一个 InputBoxForm,并为该窗体提供此属性的方法:
public Predicate<char> isKeyValid { get; set; }
它在这里运行:

    private void textBoxInput_KeyPress(object sender, KeyPressEventArgs e)
    {
        if (isKeyValid != null)
        {
            e.Handled = !isKeyValid(e.KeyChar);
        }
    }

这个想法是开发人员将派生我的类并创建他自己的逻辑来处理从用户那里获取字符。

静态 Show 方法的此实现为:

    public static string Show(string i_Prompt)
    {
        string input = string.Empty;
        using (InputBoxForm form = new InputBoxForm(i_Prompt))
        {
            form.isKeyValid = s_Instance.keyValidationLogic;
            if (form.ShowDialog() == DialogResult.OK)
            {
                input = form.Input;
            }
        }
        return input;
    }

模板是keyValidationLogic。(对于基本输入框中的所有键返回 true)
问题,如您所见,我无法覆盖静态方法。
如何在静态方法中实现模板方法?

我必须创建输入框的实例,但我想使用派生类实例

InputBox不是静态的。 我希望它被派生,以便开发人员能够自定义输入框的逻辑。

谢谢

在静态方法中创建模板方法

我不确定您的方法是解决此问题的最佳方法,但您应该能够通过以下方式解决问题。

您可以使用普通继承来执行此操作:

class InputBox
{
    protected virtual bool ValidateKey(char key)
    {
        // Allow anything
        return true;
    }
    public string Show(string i_Prompt)
    {
        using (InputBoxForm form = new InputBoxForm(i_Prompt))
        {
            form.isKeyValid = this.ValidateKey;
            if (form.ShowDialog() == DialogResult.OK)
            {
                return form.Input;
            }
        }
        return string.Empty;
    } 
}
class DigitInputBox : InputBox
{
    protected override bool ValidateKey(char key)
    {
        return key >= '0' && key <= '9';
    }
}

要使用:

(new MyCustomizedInputBox()).Show("Numbers only, please!");