簡體   English   中英

公共靜態方法+接口

[英]public static method + interface

由於我們無法在接口中定義公共靜態方法,這樣的接口是否可以在具有public static的類中實現?

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

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

不,C#不允許靜態接口。

接口被設計為充當類之間的契約,該契約定義這些類的每個實例都將具有一組方法。

Jon Skeet在這個問題上做了很好的解釋,我建議你閱讀它。

當你有一個對象實例時,將它作為一個接口進行轉換和使用是有意義的。 但是當你使用靜態的東西時,情況並非如此。 您只能通過包含類的名稱訪問靜態成員,不能像實例一樣傳遞它們等。

可以實現一個接口並確保它沒有多次實例化,它被稱為單例模式。 單例類與靜態類類似,但它有一個可以傳遞的實例,它也可以實現接口。

不,但是你可以通過讓靜態成員返回接口的實例來獲得接近它的東西。
像這樣的東西:

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

通過這種方式,您可以獲得所有當前和未來類型的完全多態驗證。

如果你堅持要一個接收低級數據(如布爾或字符串)的驗證器進行驗證,那么你就注定要失敗了。 假設有兩個類包裝字符串數據。 通常必須以不同方式驗證這兩個類。 但驗證器無法根據輸入數據區分應用哪種驗證算法。 更糟糕的是,驗證器必須包含所有類型的所有驗證邏輯,現有的和尚未編碼的類型。 這意味着驗證器將充當一個巨大的(並且固有地不完整)switch語句。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM