1

電子メール、URL、電話番号などのオブジェクトの検証とロジックをカプセル化するクラスを作成しようとしています。IsValid最初の試行で、すべてのクラス、特に staticと.で同じコードを繰り返していることがわかりました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){}
}

問題はIsValidBaseClass の static メソッドにあります。現在のコードでは、インスタンス メンバーとしてエラーをスローしRegexPatternますRegexOption。インスタンスと静的メソッドに同じ値を 2 回定義したくありません。私が使用すると動作します

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代わりに値をコンストラクターの一部にして、フィールドに保持することをお勧めします。

各サブクラスに単一の個別のバリデーターがある場合、2つの懸念事項を分離します。つまり、各サブクラスに異なるタイプの静的プロパティを指定します。これを多形的に呼び出すことはできませんが、とにかく本当にしたくないようです。

ここでは、クラスが何を表すのかを実際に伝えることはできません。より具体的なコンテキストを提供できれば、おそらくもっと役立つ可能性があります。

于 2012-10-13T08:17:34.923 に答える
-1

IsValid拡張メソッドを作成してみることができます。

于 2012-10-13T09:24:43.003 に答える