我想創建類來封裝對象的驗證和邏輯,如電子郵件,URL,電話號碼等。在第一次嘗試中,我發現我重複所有類中的相同代碼,特別是靜態IsValid
和Constructor
。所以我決定創建一個基類,把所有相同的代碼放在裏面。所以有一個基類其他類繼承它。它的摘要 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
。在當前代碼中它會引發錯誤,因爲RegexPattern
和RegexOption
是實例成員。我不想爲實例和靜態方法定義兩次相同的值。它工作如果我使用
const string RegexPattern= ".*";
const RegexOptions RegexOption =RegexOptions.SingleLine;
但我需要能夠覆蓋子類中的這些值,所以這是不適用的。因爲我已經將BaseClass
定義爲abstract
我不能在靜態方法中實例化它以訪問屬性。
因爲我想使用靜態方法就像Email.IsValid("[email protected]");
,我不知道如何通過它傳遞實例。
那麼,如何在這種靜態方法下訪問RegexOption
和RegexPattern
?
您可以通過方法參數傳遞對象引用。 – adatapost