2014-12-30 93 views
0

我創建了一個類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); 
     } 
    } 

的想法是,開發者將獲得我的類並創建他自己對如何處理從U獲得字符邏輯SER。

此實現靜態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也不是一成不變的。我希望它能派生出來,所以開發人員可以自定義輸入框的邏輯。

感謝

+0

你說,你希望人們能夠覆蓋'InputBoxForm',或者重寫密鑰驗證邏輯? – JLRishe

+0

重寫密鑰驗證邏輯。就好像你希望用戶只輸入數字一樣,你可以改變驗證來檢查字符是否是數字 –

+0

我明白了。 'Show()'必須是靜態的,或者你可以讓人們在'InputBox()'的實例上調用'Show()'? – JLRishe

回答

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

這就是我實現它..謝謝你的答案。我將不得不考慮更多.. –