2014-02-20 118 views
2

既然我们不能在接口中定义一个公共静态方法,那么这样的接口是否可以在一个具有公共静态的类中实现呢?公共静态方法+接口

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

public class MyValidator : IValidator 
{ 
    public static bool IsValid(string data) 
    { 
     //code which returns bool 
    } 
} 
+0

接口是利用多态性的一种方式。静态成员不参与多态。 – dcastro

+0

如果您必须使用接口来定义此类行为,那么您有两种选择,单例或扩展方法。 – Candide

回答

5

不,C#不允许使用静态接口。

接口被设计为充当类之间的契约,契约定义这些类的每个实例都有一组方法。

Jon Skeet在this question中给出了很好的解释,我建议读一下。

+2

考虑使用单例设计模式和非静态方法。这可以适用于你的情况。 –

2

当你有一个对象实例时,将它作为接口进行强制转换和使用是有意义的。但是当你使用静态的东西时,事实并非如此。您只能通过包含类的名称访问静态成员,不能像实例等那样传递它们。

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

1

不,但您可以通过让静态成员返回接口的实例来获得更接近它的东西。
财产以后这样的:

bool isValid = MyValidator.Instance.IsValid("data"); 
+0

使它成为一个私人支持领域的公共财产。 – dcastro

+0

@dcastro,是的,你可以做。在堆栈溢出时,我总是尽量写出最小数量的自包含的工作代码;只是要问或回答这个问题。我认为额外的代码只是让它很难看到哪个位真正回答了问题。 –

0

无法通过该接口定义静态成员,因此,如果是由设计所需要的静态成员,他们可以:

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

这样,你获得所有当前和未来的类型完全多态性验证。

如果你坚持让验证器接收低级数据(比如布尔值或字符串)进行验证,那么你已经半途而废了。假设有两个包装字符串数据的类。这两个类通常必须以不同的方式进行验证。但验证程序将无法根据输入数据区分应用哪种验证算法。更糟糕的是,验证器必须包含所有类型的现有和尚未编码的所有验证逻辑。这意味着验证者将作为一个巨大的(本身不完整)转换语句。