Non vedo un problema con questo.
Non può essere visto come un semplice dettaglio di implementazione?
Puoi fare in modo che i sovraccarichi del costruttore StringValidator inviino il loro argomento a varie proprietà protette:
public class StringValidator
{
protected void Require(string strategy, object validation)
{
if (validation == null)
{
throw new ArgumentNullException("validation", string.Concat(strategy, " cannot be null");
}
}
public StringValidator(Regex regex)
{
Require("regex", regex);
RegexValidation = regex;
}
public StringValidator(string wildcard)
{
Require("wildcard", wildcard);
WildcardValidation = wildcard;
}
// Derived validators, if any, will just override this, by:
// if (NewValidation != null) {
// ...
// }
// else
// return base.Validate(input);
protected virtual bool Validate(string input)
{
if (WildcardValidation != null)
{ // Wildcard matching strategy
// return ...
}
else
{ // Regex matching strategy
// return ...
}
// Proper constructors should guarantee there is exactly one validation strategy ready
}
public bool IsValid(string input)
{
return Validate(input);
}
protected string WildcardValidation { get; private set; }
protected Regex RegexValidation { get; private set; }
// Etc
}
Penso che tu possa farla franca solo perché, fondamentalmente, quella sorta di interfaccia / contratto pubblico StringValidator con i client, è casualmente, piuttosto minimale;
In sostanza, è semplicemente,
bool IsValid(string input)
Ma sicuramente, però, non userei questo approccio di implementazione che ho appena abbozzato per cose che sono più coinvolte di quella dopo il tempo di costruzione, e / o per un'interfaccia pubblica più ricca (con o senza stato mutabile).
'Spero che questo aiuti.