Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 公共静态方法&x2B;接口_C#_Interface_Static - Fatal编程技术网

C# 公共静态方法&x2B;接口

C# 公共静态方法&x2B;接口,c#,interface,static,C#,Interface,Static,既然我们不能在接口中定义公共静态方法,那么这样的接口可以在具有公共静态的类中实现吗 public interface IValidator { bool IsValid(bool data); } public class MyValidator : IValidator { public static bool IsValid(string data) { //code which returns bool } } 不,C#不允许静态接口 接

既然我们不能在接口中定义公共静态方法,那么这样的接口可以在具有公共静态的类中实现吗

public interface IValidator
{
    bool IsValid(bool data);
}

public class MyValidator : IValidator
{
    public static bool IsValid(string data)
    {
        //code which returns bool
    }
}
不,C#不允许静态接口

接口被设计成类之间的契约,该契约定义了这些类的每个实例都有一组方法


Jon Skeet在中给出了一个很好的解释,我建议您阅读它。

当您有一个对象实例时,将其转换并用作接口是有意义的。但是当你处理静态的东西时,情况并非如此。您只能通过包含类的名称访问静态成员,不能像实例一样传递它们


可以实现一个接口,并确保它没有被多次实例化,它被称为单例模式。singleton类类似于静态类,但它有一个可以传递的实例,也可以实现接口。

否,但可以通过让静态成员返回接口的实例来接近它。
有点像:

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");

不能通过接口定义静态成员,因此,如果设计需要静态成员,则只能将其添加到具体类型中

这最终会产生很多混乱。任何其他实现都不会有相同的成员。模拟实例将无法访问该成员。等等

解决方案是避免声明静态成员。在您的特殊情况下,我反对界面的设计。我更希望看到类实现一些接口,如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,可以这样做。在堆栈溢出时,我总是尝试编写最少的自包含工作代码;只是问或回答问题。我认为额外的代码只会让我们更难看到哪一位真正回答了这个问题。