由于我们无法在接口中定义公共静态方法,这样的接口是否可以在具有public static的类中实现?
public interface IValidator
{
bool IsValid(bool data);
}
public class MyValidator : IValidator
{
public static bool IsValid(string data)
{
//code which returns bool
}
}
答案 0 :(得分:5)
答案 1 :(得分:2)
当你有一个对象实例时,将它作为一个接口进行转换是有意义的。但是当你使用静态的东西时,情况并非如此。您只能通过包含类的名称访问静态成员,不能像实例一样传递它们等。
可以实现一个接口,并确保它没有多次实例化,它被称为单例模式。单例类与静态类类似,但它有一个可以传递的实例,它也可以实现接口。
答案 2 :(得分:1)
不,但是通过让静态成员返回接口的实例,你可以得到一些接近它的东西 像这样的东西:
public class MyValidator : IValidator
{
public bool IsValid(string data)
{
//code which returns bool
}
public static readonly IValidator Instance = new MyValidator();
}
然后你可以以静态的方式使用它:
bool isValid = MyValidator.Instance.IsValid("data");
答案 3 :(得分:0)
您无法通过界面定义静态成员,因此如果设计需要静态成员,则只能将其添加到具体类型中。
这最终会产生很多混乱。任何其他实现都不会有相同的成员。模拟实例将无法访问该成员。等等。
解决方案是避免声明静态成员。在您的特定情况下,我会反对界面的设计。我更希望看到类实现一些类似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);
}
}
通过这种方式,您可以获得所有当前和未来类型的完全多态验证。
如果您坚持使用接收低级数据(例如布尔值或字符串)的验证器进行验证,那么您将注定失败。假设有两个类包装字符串数据。通常必须以不同方式验证这两个类。但验证器无法根据输入数据区分应用哪种验证算法。更糟糕的是,验证器必须包含所有类型的所有验证逻辑,现有的和尚未编码的类型。这意味着验证器将充当一个巨大的(并且本质上是不完整的)switch语句。