我正在尝试创建类来封装电子邮件,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){}
}
问题在于BaseClass的静态IsValid
方法。在当前代码中,它会抛出错误,因为RegexPattern
和RegexOption
是实例成员。我不想为实例和静态方法两次定义相同的值。如果我使用
const string RegexPattern= ".*";
const RegexOptions RegexOption =RegexOptions.SingleLine;
但我需要能够在子类中覆盖这些值,因此这不适用。并且我已将BaseClass
定义为abstract
我无法在静态方法中实例化它以访问属性。
因为我想像Email.IsValid("foo@bar.com");
那样使用静态方法,我不知道如何通过它传递实例。
那么,如何在此静态方法中访问RegexOption
和RegexPattern
?
答案 0 :(得分:4)
那么,如何在这种静态方法中访问PropOne和PropTwo?
你需要一个实例以某种方式,否则这是一个毫无意义的操作。所以问题是 - 你将如何想要来识别你感兴趣的实例?您真的需要Validate
完全是静态的吗?
请注意,如果您期望值在整个类的实例中始终保持不变,而不是具有抽象属性,您可能希望将值设置为BaseClass
的构造函数的一部分,并且只保留他们在田野里。
如果你想要实现的是每个子类都有一个单独的验证器,我会将这两个问题分开 - 给每个子类一个不同类型的静态属性 。你无法以多态方式调用它,但听起来好像你真的不想这样。
我们无法真正告诉你的课程在这里要表示什么 - 如果你能给我们更具体的背景,我们可能会更有帮助。
答案 1 :(得分:-1)
您可以尝试将IsValid
作为扩展方法。