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

时间:2014-12-30 21:50:47

标签: c# .net inheritance

我创建了一个只有一个方法的类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。 (对于基本InputBox中的所有键,返回true)
问题,你可以看到我无法覆盖静态方法。
我如何在静态方法中实现模板方法?

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

班级InputBox不是静态的。我希望它是派生的,因此开发人员将能够自定义输入框的逻辑。

谢谢

1 个答案:

答案 0 :(得分:2)

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

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

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!");