[英]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
}
}
當你有一個對象實例時,將它作為一個接口進行轉換和使用是有意義的。 但是當你使用靜態的東西時,情況並非如此。 您只能通過包含類的名稱訪問靜態成員,不能像實例一樣傳遞它們等。
可以實現一個接口並確保它沒有多次實例化,它被稱為單例模式。 單例類與靜態類類似,但它有一個可以傳遞的實例,它也可以實現接口。
不,但是你可以通過讓靜態成員返回接口的實例來獲得接近它的東西。
像這樣的東西:
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.