[C#]為什么Interface里的成員不能使用static修飾?


首先引用MSDN里的原文

Interface members are automatically public, and they can't include any access modifiers. Members also can't be static

                  --https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/interfaces/index

即:接口成員會自動成為公共成員,不能包含任何訪問修飾符。 成員也不能是靜態成員。

 

那么我們先不討論編譯器內部發生了什么,先從語法上來理解:為何Interface(接口)內的成員不能使用static修飾符。

 

我們知道,對一個實現接口的類,可以用顯式方式實現接口定義的成員,也可以用隱式方式來實現。

那么假設可以定義帶有一個靜態成員 StaticString() 的接口 IStatic,並定義一個類 StaticClass 顯式實現這個接口。

public Interface IStatic{
    static String StaticString();
}

public class StaticClass:IStatic
{
    static IStatic.StaticString();
}

那么我們要如何使用這個靜態成員呢?既然是顯式實現,那么就要以接口的形式調用此成員。而要實現此接口,就要建立一個實例。

IStatic staticClass=new StaticClass();
String someString=IStatic.StaticString();

發現了嗎?雖然我們聲明了staticClass為一個StaticClass實例,但是我們調用成員時還是要通過IStatic接口。實際上,IStatic.StaticString()並沒有指定任何一個實例,那么使用接口成員就無從談起了。

 

若我們隱式實現IStatic接口:

public Interface IStatic{
    static String StaticString();
}

public class StaticClass:IStatic
{
    public static String StaticString();
}

那我們就要這樣使用StaticString成員:

IStatic staticClass=new StaticClass();
String someString=StaticClass.StaticString();

同樣,雖然StaticClass實現了IStatic接口,但是在使用靜態成員時我們僅以StaticClass來進行調用,與IStatic接口沒有任何的關系。

因此,無論是顯式實現還是隱式實現接口的靜態成員,實際使用上都是沒有意義的,也就不難理解為何在C#里面為何接口成員(包括接口本身)為何不能使用static修飾詞了。

 


 

以下是筆者的閑談:

在不同的書本上已經不止一次看到對於接口修飾詞的說明了,包括C# in depth等,但是由於書中一般只會進行一兩句話的描述,因此在筆者腦海里一直沒有形成知識體系。而由於工作的性質,我也很少或者沒有用到C#里關於面向對象的性質。最近在寫一個WebAPI接口的工具類中突然要寫數個接口,突然回想起這個性質。

其實本質很簡單,但是要形成腦海里的知識體系,個人認為還是將它用最淺顯的方法演示一次更為有效。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM