接口中“new”运算符的含义?以泛型IEnumerable接口为例
接口中
new关键字的含义(以IEnumerable为例) 咱们先把“new用来创建实例”这个固有认知暂时放一边——在接口的继承场景里,new关键字的作用是显式声明要隐藏基接口中的同名成员,说白了就是告诉编译器:“我知道基接口已经有一个叫这个名字的成员了,但我就是要在当前接口里定义一个全新的同名成员,它和基接口的那个不是一回事,别给我弹警告!”
回到你给出的代码例子:
- 非泛型的
IEnumerable接口定义了返回非泛型IEnumerator的GetEnumerator()方法; - 泛型的
IEnumerable<out T>继承自非泛版,然后用new关键字声明了返回泛型IEnumerator<T>的GetEnumerator()。
这里的new主要有两个核心作用:
- 消除编译警告:如果没有这个
new,编译器会提示你“当前接口的成员隐藏了基接口的同名成员”,加上new就是明确告诉编译器这是你故意做的,不是疏忽; - 明确成员的独立性:这两个
GetEnumerator()是完全独立的抽象契约——当你实现IEnumerable<T>接口时,需要同时实现这两个方法(泛型版和非泛型版),而在调用时:- 如果你的变量是
IEnumerable<T>类型,调用GetEnumerator()会触发泛型版; - 如果变量是
IEnumerable类型,调用的就是非泛型版。
- 如果你的变量是
要注意的是,接口里的new和类里的new逻辑不同:类里的new是隐藏基类的具体实现,而接口里因为没有具体实现,new只是标记两个同名成员的独立性,让编译器和开发者都清楚这是两个不同的抽象要求。
内容的提问来源于stack exchange,提问作者RollRoll
相关产品推荐
相关产品推荐

