我正在尝试创建类来封装电子邮件、URL、电话号码等对象的验证和逻辑。在第一次尝试中,我发现我在所有类中重复相同的代码,特别IsValid
是静态和Constructor
. 所以我决定创建一个基类来将所有相同的代码放入其中。所以有一个基类,其他类继承它。它是抽象的,因为我不想直接使用它。
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){}
}
IsValid
问题出在 BaseClass的静态方法上。在当前代码中,它作为实例成员引发RegexPattern
错误RegexOption
。我不想为实例和静态方法定义相同的值两次。如果我使用它会起作用
const string RegexPattern= ".*";
const RegexOptions RegexOption =RegexOptions.SingleLine;
但我需要能够在子类中覆盖这些值,所以这不适用。正如我已经定义的BaseClass
那样,abstract
我无法在静态方法中实例化它以访问属性。
因为我想使用静态方法Email.IsValid("foo@bar.com");
,所以我不知道如何通过它传递一个实例。
RegexOption
那么,我怎样才能访问RegexPattern
这个静态方法呢?