[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接口的工具类中突然要写数个接口,突然回想起这个性质。
其实本质很简单,但是要形成脑海里的知识体系,个人认为还是将它用最浅显的方法演示一次更为有效。
[C#]为什么Interface里的成员不能使用static修饰?的更多相关文章
- static修饰的成员与非static修饰类的成员的区别
① 格式 : 1> static修饰的,称为静态成员,非static修饰的,称为非静态成员. ② 内存位置: 1>static修饰的,在方法区的静态区中,非static修饰的,在堆中的对象 ...
- C++ 【静态成员】static修饰的成员
首先,我们先通过字面意思来理解... 成员:成员变量.成员函数. static 修饰成员变量,还有修饰成员函数. static 声明为静态的,称为静态成员.不管这个类创建了多少个对象,静态成员只有 ...
- 假如java类里的成员变量是自身的对象
假如java类里的成员变量是自身的对象,则新建该类对象时内存中怎么分配空间,我感觉似乎死循环了. 不过我想的肯定是错的,因为很多类的成员变量是自身对象,并且绝对无错,举个例子: Class A{ pr ...
- “全栈2019”Java第八十一章:外部类能否访问嵌套接口里的成员?
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- 读陈浩的《C语言结构体里的成员数组和指针》总结,零长度数组
原文链接:C语言结构体里的成员数组和指针 复制例如以下: 单看这文章的标题,你可能会认为好像没什么意思.你先别下这个结论,相信这篇文章会对你理解C语言有帮助.这篇文章产生的背景是在微博上,看到@Lar ...
- java类里的成员变量是自身的对象问题
今晚看单例模式饿汉时想到一个问题:假如java类里的成员变量是自身的对象,则新建该类对象时内存中怎么分配空间,我感觉似乎死循环了.于是上网搜索了下,哈哈,果然有人早就思考过这个问题了,站在巨人的肩膀上 ...
- AbStract 和Interface 方法是否能用Static修饰,为什么?
Abstract 和Interface 方法是否能用Static修饰,为什么? interface中不能含有Static方法,属性,成员变量. Abstract中可以有Static方法,属性,成员变量 ...
- JAVA_SE基础——34.static修饰成员变量
需求:描述一下学校的学生. 特点:都是中国人.... 测试代码1: class Student{ String name; String country = "中国"; //国籍 ...
- static 类成员变量 和 static const类成员变量
1.使用static类的优点: (1)避免与其他类的成员或者全局变量冲突 (2)可以封装 (3)阅读性好 2.static 数据成员独立于该类的任意对象而存在 static数据成员的类型可以是该成员所 ...
随机推荐
- EM最大期望算法
[简介] em算法,指的是最大期望算法(Expectation Maximization Algorithm,又译期望最大化算法),是一种迭代算法,在统计学中被用于寻找,依赖于不可观察的隐性变量的概率 ...
- 【转】eclipse上的.properties文件中文编辑显示问题
首先,解决.properties文件中的中文编辑问题,我们发现,在.properties文件中输入的中文变成了这个样子: 这是eclipse的.properties文件,默认的编码方式是iso-885 ...
- php __CLASS__、get_class()与get_called_class()的区别
__CLASS__获取当前的类名, get_class()与上面一样,都是获取当前的类名 get_called_class()获取当前主调类的类名 当涉及到继承时,在方法中使用类名.直接贴图了 MVC ...
- 安装openstack时遇到的错误
学习opensatck的第一步是安装DevStack来进行本机操作 1. 下面命令没有权限,解决办法:切换到root用户下执行sudo -s echo "stack ALL=(ALL) NO ...
- 初识 iOS 自动化测试框架 WebDriverAgent
微信跳一跳最近很火,外挂代练什么的也越来越多.作为一只程序猿,对外挂的原理产生了强烈的好奇心,于是埋头研究了一阶段,注意到了 WebDriverAgent 这套 Facebook 出品的自动化测试框架 ...
- 单元测试mock框架——jmockit实战
JMockit是google code上面的一个java单元测试mock项目,她很方便地让你对单元测试中的final类,静态方法,构造方法进行mock,功能强大.项目地址在:http://jmocki ...
- mkpasswd的使用
首先安装except包:yum -y install except 参数: -l # (密码的长度定义, 默认是 9) -d # (数字个数, 默认是 2) -c # (小写字符个数, 默认是 2) ...
- MyCnblog Style
以下内容添加到页脚HTML代码处 <style> #leftmenu ul { display: none; } .cnblogs-markdown pre code, .cnblogs- ...
- Android官方架构组件介绍之LiveData(二)
LiveData LiveData是一个用于持有数据并支持数据可被监听(观察).和传统的观察者模式中的被观察者不一样,LiveData是一个生命周期感知组件,因此观察者可以指定某一个LifeCycle ...
- sql server 笔记(数据类型/新建、修改、删除数据表/)
1.数据类型: Character 字符串 / Unicode 字符串 / Binary 类型 / Number 类型 / Date 类型 / 其他数据类型 详解:http://www.w3sc ...