2012-10-13 74 views
1

我想創建類來封裝對象的驗證和邏輯,如電子郵件,URL,電話號碼等。在第一次嘗試中,我發現我重複所有類中的相同代碼,特別是靜態IsValidConstructor。所以我決定創建一個基類,把所有相同的代碼放在裏面。所以有一個基類其他類繼承它。它的摘要 as I 不要想要它被使用直接如何在靜態方法中訪問實例成員?

public abstract class BaseClass 
{ 
      protected string value; 
      private bool isValid; 

      public bool IsValid{get { return this.isValid;}} 

    protected virtual string RegexPattern{get;} 

    protected virtual RegexOptions RegexOption{get;} 

    private BaseClase(){} 

    protected BaseClass(string value) 
    { 
     this.isValid = Validator.IsValid(value , RegexPattern, RegexOption); 
     this.value = this.isValid ? value : string.Empty; 
    } 

    public static bool Validate(string value) 
    { 
     return Validator.IsValid(value ,RegexPattern, RegexOption); // rror 
    } 

} 

public class Email 
{ 
    private override string RegexPattern 
    { 
     get 
     { 
      return ".*"; 
     } 
    } 

    private override RegexOptions RegexOption 
    { 
     get 
     { 
      return RegexOptions.SingleLine; 
     } 
    } 

      public string Address{get {return this.value; }} 

    public Email(string address) : base(address){} 
} 

問題在於BaseClass的靜態方法IsValid。在當前代碼中它會引發錯誤,因爲RegexPatternRegexOption是實例成員。我不想爲實例和靜態方法定義兩次相同的值。它工作如果我使用

const string RegexPattern= ".*"; 
const RegexOptions RegexOption =RegexOptions.SingleLine; 

但我需要能夠覆蓋子類中的這些值,所以這是不適用的。因爲我已經將BaseClass定義爲abstract我不能在靜態方法中實例化它以訪問屬性。

因爲我想使用靜態方法就像Email.IsValid("[email protected]");,我不知道如何通過它傳遞實例。

那麼,如何在這種靜態方法下訪問RegexOptionRegexPattern

+0

您可以通過方法參數傳遞對象引用。 – adatapost

回答

4

那麼,我怎樣才能在這個靜態方法中訪問PropOne和PropTwo?

你需要有一個實例,否則這是一個沒有意義的操作。所以問題是 - 你如何來確定你感興趣的實例?你真的需要Validate是靜態的嗎?

請注意,如果您希望在整個類的實例中始終保持相同的值,您可能希望將值作爲BaseClass的構造函數的一部分,而不是保留在字段中。

如果你試圖實現的是每個子類都有一個單獨的驗證器,我會分開兩個問題 - 給每個子類一個不同類型的靜態屬性。你將無法多形地調用它,但它聽起來像你不想真的想要。

我們無法確切知道您的類在這裏代表什麼 - 如果您能給我們更具體的上下文,我們可能會更有幫助。

+0

對不起,我總是試圖使問題變得簡單而一般,所以我總是會刪除必要的部分。我剛更新了這個問題。我希望它現在更清晰 –

+0

不完全,因爲'BaseClass'沒有給出關於類*的用途的任何說明。它是否意味着成爲一個驗證器,並且只是一個驗證器或其他東西?你真的*需要*子類,或者只是一些預先確認不同事物的預先實例嗎? –

+0

真的很抱歉,我更新了問題。當我檢查代碼時,唯一的區別是模式和選項以及返回值變量的屬性的名稱。 –

0

您可以嘗試製作IsValid的擴展方法。