代码改变世界

[C#]为什么Interface里的成员不能使用static修饰?

2018-01-23 11:19  新田三十三  阅读(3133)  评论(1编辑  收藏  举报

首先引用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接口的工具类中突然要写数个接口,突然回想起这个性质。

其实本质很简单,但是要形成脑海里的知识体系,个人认为还是将它用最浅显的方法演示一次更为有效。