1

我正在尝试创建类来封装电子邮件、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这个静态方法呢?

4

2 回答 2

4

那么,我怎样才能在这个静态方法中访问 PropOne 和 PropTwo 呢?

您需要以某种方式拥有一个实例,否则这是一个无意义的操作。所以问题是——你如何识别你感兴趣的实例?你真的需要Validate保持静止吗?

请注意,如果您希望值在整个类的实例中始终保持不变,而不是具有抽象属性,那么您可能希望将值作为构造函数的一部分BaseClass,并将它们保留在字段中。

如果您要实现的是每个子类都有一个单独的验证器,我会将这两个问题分开 - 给每个子类一个不同类型的静态属性。你不能多态地调用它,但听起来你真的不想这样做。

我们无法真正说出您的类在这里代表什么 - 如果您能给我们更具体的上下文,我们可能会更有帮助。

于 2012-10-13T08:17:34.923 回答
-1

您可以尝试制作IsValid扩展方法。

于 2012-10-13T09:24:43.003 回答