zoukankan      html  css  js  c++  java
  • [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接口的工具类中突然要写数个接口,突然回想起这个性质。

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

  • 相关阅读:
    自动打包脚本
    Tomcat内存溢出问题
    Nginx笔记总结二十:nginx索引目录配置
    Nginx笔记总结十九:nginx + fancy实现漂亮的索引目录
    Nginx笔记总结十八:nginx统计响应的http状态码信息(ngx-http-status-code-counter)
    Nginx笔记总结十七:nginx生成缩略图配置(http_image_filter_module)
    Nginx笔记总结十六:nginx优化指南
    Nginx笔记总结十五:nginx+keepalive+proxy_cache配置高可用nginx集群和高速缓存
    Nginx笔记总结十四: nginx反向代理,用内网域名转发
    Nginx笔记总结十三:nginx 正向代理
  • 原文地址:https://www.cnblogs.com/mirageJ/p/8334762.html
Copyright © 2011-2022 走看看