媒介
人人应当都晓得,在.Net中供应了接口,这个差别于Class或许Struct的范例定义。接口有些状况,看似和笼统类一样,因而有些人以为在.Net能够完整用接口来替代笼统类。实在不然,接口和笼统类各有优点和缺点,因而每每在运用当中,二者要连系来运用,从而互补是非。下面话不多说,来一同看看细致的引见吧。
接下来先说说笼统类和接口的区分:
区分一,二者表达的观点不一样。笼统类是一类事物的高度聚合,那末关于继续笼统类的子类来讲,关于笼统类来讲,属于“是”的关联;而接口是定义行动规范,因而关于完成接口的子类来讲,相关于接口来讲,是“行动须要根据接口来完成”。这些听起来有些虚,举个例子。比方,狗是关于一切狗类动物的统称,京哈是狗,牧羊犬是狗,那末狗的平常特征,都邑在京哈,牧羊犬中找到,那末狗相关于京哈和牧羊犬来讲,就属于这类事物的笼统范例;而关于“叫”这个行动来讲,狗能够叫,鸟也能够叫。很明显,前者相当于所说的是笼统类,而后者指的就是接口。
区分二,笼统类在定义范例要领的时刻,能够给出要领的完成部份,也能够不给出;而关于接口来讲,个中所定义的要领都不能给出完成部份。
比方:
publicabstractclassAbsTest { publicvirtualvoidTest() { Debug.WriteLine("Test"); } publicabstractvoidNewTest(); } publicinterfaceITest { voidTest(); voidNewTest(); }
区分三,继续类关于二者所触及要领的完成是差别的。继续类关于笼统类所定义的笼统要领,能够不必重写,也就是说,能够延用笼统类的要领;而关于接口类所定义的要领或许属性来讲,在继续类中必需要给出响应的要领和属性完成。
区分四,在笼统类中,新增一个要领的话,继续类中能够不必作任何处置惩罚;而关于接口来讲,则须要修正继续类,供应新定义的要领。
晓得了二者的区分,再来讲说,接口相关于笼统类的上风。
优点一,接口不光能够作用于援用范例,也能够作用于值范例。而笼统类来讲,只能作用于援用范例。
优点二,.Net的范例继续只能是单继续的,也就是说一个范例只能继续一个范例,而能够继续多个接口。实在,我关于这一点也比较赞许,多继续会使继续树变的杂沓。
优点三,由于接口只是定义属性和要领,而与真正完成的范例没有太大的关联,因而接口能够被多个范例重用。相关于此,笼统类与继续类的关联更严密些。
优点四,经由过程接口,能够削减范例暴露的属性和要领,从而便于庇护范例对象。当一个完成接口的范例,能够包括其他要领或许属性,然则要领返回的时刻,能够返回接口对象,如许挪用端,只能经由过程接口供应的要领或许属性,接见对象的相干元素,如许能够有用庇护对象的其他元素。
优点五,削减值范例的拆箱操纵。关于Struct定义的值范例数据,当寄存鸠合当中,每当取出来,都须要举行拆箱操纵,这时候采纳Struct+Interface连系的要领,从而下降拆箱操纵。
相关于笼统类来讲,接口有这么多优点,然则接口有一个致命的缺点,就是接口所定义的要领和属性只能相关于继续它的范例(除非在继续类中修正接口定义的函数标示),那末关于多层继续关联的时刻,光用接口就很难完成。由于假如让每一个范例都去继续接口而举行完成的话,起首不说编写代码比较烦琐,有时刻实行的效果照样毛病,特别当子范例对象隐式转换成基类对象举行接见的时刻。
那末这时候刻,须要用接口连系虚要领来完成。实在在继续中,究竟运用接口照样笼统类。接口是牢固的,约定俗成的,因而在继续类中必需供应接口响应的要领和属性的完成。而关于笼统类来讲,笼统类的定义要领的完成,贯串全部继续树,因而个中要领的完成或许重写都是不确定的。因而相对而言,笼统类比接口更天真一些。
以下给出二者的简朴对照表格。
接口 |
笼统类 |
|
多继续 |
支撑 |
不支撑 |
范例限定 |
没有 |
有,只能是援用范例 |
要领完成 |
继续范例中必需给出要领完成 |
继续类中能够不给出 |
扩展性 |
比较贫苦 |
相对照较天真 |
多层继续 |
比较贫苦,须要借助虚函数 |
比较天真 |
总的来讲,接口和笼统类是.Net为了更好的完成范例之间继续关联而供应的言语手腕,而且二者有些相辅相成的关联。因而我并不强挪用什么而不必什么,那末题目的关键在于,怎样把这两种手腕合理的运用到顺序当中,这才是至关重要。
以上就是比较.NET中接口与类的细致内容,更多请关注ki4网别的相干文章!