Code Bye

函数返回值为泛型接口的问题。

 

XElement xe = XElement.Load(xmlFilePath);
        IEnumerable<XElement> element = from item in xe.Descendants(“ThemeName”)
                                        select item; 
XElement first = element.First();
中间这个语句返回一个泛型的接口,最后这句话还调用了接口的方法,请教一下,接口的任何方法是没有实现的,只是有声明,为什么可以直接调用泛型接口的方法?另外就是 请教下接口只是一种声明性的东西,为什么可以作为方法的返回值,该怎么去理解?

 

15分
那是Linq语法,在System.Linq.Enumerable类中定义的扩展方法,原型时
public static TSource First<TSource>(this IEnumerable<TSource> source);
并不是IEnumerable中定义的方法,其实你可以在VS中,按F12转到方法的定义就知道了
扩展方法你查下资料

15分
类基础接口
使用的时候,接口被实例化具体的类对象,那么通过接口调用方法,就是调用实例化的类对象实现的接口方法
接口作为返回值,使得方法具有一定的灵活性。
比如接口
interface IPerson

class Male:IPerson{}
class Femal:IPerson{}
方法返回的时候可以返回Male对象,也可以返回Female对象,这样就你无需根据男人还是女人定义两个方法了。
引用 1 楼 dongxinxi 的回复:

那是Linq语法,在System.Linq.Enumerable类中定义的扩展方法,原型时
public static TSource First<TSource>(this IEnumerable<TSource> source);
并不是IEnumerable中定义的方法,其实你可以在VS中,按F12转到方法的定义就知道了
扩展方法你查下资料

我也看到了element.First();是去调用了System.Linq.Enumerable类中的first方法,但element是IEnumerable<XElement> 接口类型,它为什么可以去调用Enumerable这个类的方法呢?

引用 2 楼 lovelj2012 的回复:

类基础接口
使用的时候,接口被实例化具体的类对象,那么通过接口调用方法,就是调用实例化的类对象实现的接口方法

上述我列出这个代码,什么地方看出来这个接口被引用到了类上?

IEnumerable<>是IEnumerable的泛型实现
引用 5 楼 ksly2008 的回复:
Quote: 引用 2 楼 lovelj2012 的回复:

类继承接口
使用的时候,接口被实例化具体的类对象,那么通过接口调用方法,就是调用实例化的类对象实现的接口方法

上述我列出这个代码,什么地方看出来这个接口被引用到了类上?

IEnumerable<T>继承IEnumerable接口
IEnumerable:公开枚举数,该枚举数支持在非泛型集合上进行简单迭代(比如foreach遍历)
pre class=”brush: csharp”>XElement xe = XElement.Load(xmlFilePath);
         IEnumerable<XElement> element = from item in xe.Descendants(“ThemeName”)
                                         select item; 

 

element的值是XElement集合(具体的类对象)


10分
虽然返回的是接口,但绝不可能是纯接口,而是实现了该接口的某个具体的类,只是无需关心罢了.
好比说小明回家对妈妈说,我饿了来点吃的,这”能吃的”是个接口,而实际上吃到的是”面包”,”米饭”等具体的对象.
只是规定了返回值的类型要实现接口,element本身就只是个实例。最后一句调用的可以是类型实现接口的方法,也可以是类型本身的方法。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明函数返回值为泛型接口的问题。