无法通过该接口定义静态成员,因此,如果是由设计所需要的静态成员,他们可以:
public class MyValidator : IValidator
{
public bool IsValid(string data)
{
//code which returns bool
}
public static readonly IValidator Instance = new MyValidator();
}
然后,你可以在一个静态排序的方式来使用它只能添加到具体类型。
这最终会产生很多混淆。任何其他实现不会有相同的成员。嘲笑的实例将无法访问该成员。等等。
解决方法是避免声明静态成员。在你的具体情况下,我会反对界面的设计。我宁愿看到类实现像IValidatable一些接口:
public interface IValidatable
{
bool IsValid();
}
...
public class SomeBoolClass: IValidatable
{
private bool Data;
public bool IsValid()
{
return this.Data; // i.e. return Data == true
}
}
...
public class SomeStringClass: IValidatable
{
private string Data;
public bool IsValid()
{
return !string.IsNullOrEmpty(this.Data);
}
}
这样,你获得所有当前和未来的类型完全多态性验证。
如果你坚持让验证器接收低级数据(比如布尔值或字符串)进行验证,那么你已经半途而废了。假设有两个包装字符串数据的类。这两个类通常必须以不同的方式进行验证。但验证程序将无法根据输入数据区分应用哪种验证算法。更糟糕的是,验证器必须包含所有类型的现有和尚未编码的所有验证逻辑。这意味着验证者将作为一个巨大的(本身不完整)转换语句。
接口是利用多态性的一种方式。静态成员不参与多态。 – dcastro
如果您必须使用接口来定义此类行为,那么您有两种选择,单例或扩展方法。 – Candide