電子メール、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){}
}
問題はIsValid
BaseClass の static メソッドにあります。現在のコードでは、インスタンス メンバーとしてエラーをスローしRegexPattern
ますRegexOption
。インスタンスと静的メソッドに同じ値を 2 回定義したくありません。私が使用すると動作します
const string RegexPattern= ".*";
const RegexOptions RegexOption =RegexOptions.SingleLine;
しかし、サブクラスでこれらの値をオーバーライドできるようにする必要があるため、これは適用できません。そして、私が定義したBaseClass
ようabstract
に、静的メソッド内でインスタンス化してプロパティにアクセスすることはできません。
と同じようEmail.IsValid("foo@bar.com");
に静的メソッドを使用したいので、インスタンスを渡す方法がわかりません。
では、どうすればこの静的メソッドにRegexOption
アクセスできますか?RegexPattern