问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

在.NET中的抽象类和接口的区别

发布网友 发布时间:2022-04-27 08:40

我来回答

3个回答

懂视网 时间:2022-04-27 13:02

前言

大家应该都知道,在.Net中提供了接口,这个不同于Class或者Struct的类型定义。接口有些情况,看似和抽象类一样,因此有些人认为在.Net可以完全用接口来替换抽象类。其实不然,接口和抽象类各有长处和缺陷,因此往往在应用当中,两者要结合来使用,从而互补长短。下面话不多说,来一起看看详细的介绍吧。

接下来先说说抽象类和接口的区别:

区别一,两者表达的概念不一样。抽象类是一类事物的高度聚合,那么对于继承抽象类的子类来说,对于抽象类来说,属于“是”的关系;而接口是定义行为规范,因此对于实现接口的子类来说,相对于接口来说,是“行为需要按照接口来完成”。这些听起来有些虚,举个例子。例如,狗是对于所有狗类动物的统称,京哈是狗,牧羊犬是狗,那么狗的一般特性,都会在京哈,牧羊犬中找到,那么狗相对于京哈和牧羊犬来说,就属于这类事物的抽象类型;而对于“叫”这个动作来说,狗可以叫,鸟也可以叫。很明显,前者相当于所说的是抽象类,而后者指的就是接口。

区别二,抽象类在定义类型方法的时候,可以给出方法的实现部分,也可以不给出;而对于接口来说,其中所定义的方法都不能给出实现部分。

例如:

publicabstractclassAbsTest
{
publicvirtualvoidTest()
{
Debug.WriteLine("Test");
}
publicabstractvoidNewTest();
}
publicinterfaceITest
{
voidTest();
voidNewTest();
}

区别三,继承类对于两者所涉及方法的实现是不同的。继承类对于抽象类所定义的抽象方法,可以不用重写,也就是说,可以延用抽象类的方法;而对于接口类所定义的方法或者属性来说,在继承类中必须要给出相应的方法和属性实现。

区别四,在抽象类中,新增一个方法的话,继承类中可以不用作任何处理;而对于接口来说,则需要修改继承类,提供新定义的方法。

知道了两者的区别,再来说说,接口相对于抽象类的优势。

好处一,接口不光可以作用于引用类型,也可以作用于值类型。而抽象类来说,只能作用于引用类型。

好处二,.Net的类型继承只能是单继承的,也就是说一个类型只能继承一个类型,而可以继承多个接口。其实,我对于这一点也比较赞同,多继承会使继承树变的混乱。

好处三,由于接口只是定义属性和方法,而与真正实现的类型没有太大的关系,因此接口可以被多个类型重用。相对于此,抽象类与继承类的关系更紧密些。

好处四,通过接口,可以减少类型暴露的属性和方法,从而便于保护类型对象。当一个实现接口的类型,可能包含其他方法或者属性,但是方法返回的时候,可以返回接口对象,这样调用端,只能通过接口提供的方法或者属性,访问对象的相关元素,这样可以有效保护对象的其他元素。

好处五,减少值类型的拆箱操作。对于Struct定义的值类型数据,当存放集合当中,每当取出来,都需要进行拆箱操作,这时采用Struct+Interface结合的方法,从而降低拆箱操作。

相对于抽象类来说,接口有这么多好处,但是接口有一个致命的弱点,就是接口所定义的方法和属性只能相对于继承它的类型(除非在继承类中修改接口定义的函数标示),那么对于多层继承关系的时候,光用接口就很难实现。因为如果让每个类型都去继承接口而进行实现的话,首先不说编写代码比较繁琐,有时候执行的结果还是错误,尤其当子类型对象隐式转换成基类对象进行访问的时候。

那么这时候,需要用接口结合虚方法来实现。其实在继承中,到底使用接口还是抽象类。接口是固定的,约定俗成的,因此在继承类中必须提供接口相应的方法和属性的实现。而对于抽象类来说,抽象类的定义方法的实现,贯穿整个继承树,因此其中方法的实现或者重写都是不确定的。因此相对而言,抽象类比接口更灵活一些。

如下给出两者的简单对比表格。

接口

抽象类

多继承

支持

不支持

类型限制

没有

有,只能是引用类型

方法实现

继承类型中必须给出方法实现

继承类中可以不给出

扩展性

比较麻烦

相对比较灵活

多层继承

比较麻烦,需要借助虚函数

比较灵活

总的来说,接口和抽象类是.Net为了更好的实现类型之间继承关系而提供的语言手段,而且两者有些相辅相成的关系。因此我并不强调用什么而不用什么,那么问题的关键在于,如何把这两种手段合理的应用到程序当中,这才是至关重要。

总结

热心网友 时间:2022-04-27 10:10

抽象类,可以包含功能的定义,但是不能包含实现。
接口,只能包含功能的定义。

他们俩都不能被直接实例化,都可以通过继承实现其抽象方法。
都是面向抽象编程的技术基础,实现了诸多的设计模式。

接口支持多继承;抽象类不能实现多继承。
接口只能定义抽象规则;抽象类既可以定义规则,还可能提供已实现的成员。
接口是一组行为规范;抽象类是一个不完全的类,着重族的概念。
接口可以用于支持回调;抽象类不能实现回调,因为继承不支持。
接口只包含方法、属性、索引器、事件的签名,但不能定义字段和包含实现的方法;抽象类可以定义字段、属性、包含有实现的方法。
接口可以作用于值类型和引用类型;抽象类只能作用于引用类型。

热心网友 时间:2022-04-27 11:28

最主要的:接口支持多重继承
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
在RLC电路中,谐振频率为___同期为___谐振条件为___? 电磁振荡并联 RLC振荡回路的谐振频率与振荡特性 佛手柑水培还是干放 中山市美派电器有限公司怎么样? 成都美派电器有限公司怎么样? 两条不同品牌的DDR3内存条可以一起用吗 驾驶证的牡丹卡多长时间能办下来 新衣服必须用洗衣液洗才能去甲醛吗? 梦见逛街被偷抢 2024年买什么品牌的运动男鞋比较好? 损坏公私财物谅解书范文 二手物品转让协议书应当包含什么 word流程图图框文字,如图,如何使文字与边框的距离减小。我是用2010版用画布然后建立流程图 简单最有效的婚内财产协议书 管理责任转让协议怎么写 植物生长的调节物质有哪些应用? 请问白酒中的高级脂肪醇都有哪些?以及它们的合成途径? 高碳脂肪醇都有哪些品种? Net中抽象类和接口的区别 混凝土搅拌楼的基本组成 混凝土搅拌站的组成及工作流程是怎么样 60混凝土搅拌站有哪些部分构成 拼多多自动退款要多久 拼多多退款时效是多久 名义利率和实际利率和通货膨胀预期有什么关系?这个关系怎么来的?名义利率和实际利率有神马区别? 平板电脑要不要每个月去交网费? 我没有台式电脑但是有平板电脑,我想弄个wifi怎么弄啊,每个月大概要交多少钱啊,详细点 平板电脑怎么收费的 平板电脑需要交网费吗wifi版的?通话版的交的是话费是吧?是每个月交还是每年交???大概多少? 20台主机一台平板电脑二十四小时开着一个月电费多少? 怎样对电脑的文件进行加密?!!! 专科会计电算化是什么? 专科的会计电算化属于什么专业类别 我是一名大专生专业是会计电算化, 我想学会计专业,但我读的是专科,大多只有会计电算化专业,请问这个专业好吗 您好,我想问下,我专科是会计电算化,事业单位招财务管理类的我可以报名嘛_百度问一问 专科的会计电算化好学吗? 大专学历会计电算化专业好就业吗?有发展前途吗? 上大专的话,会计电算化专业与会计专业一样吗? 专科中会计和会计电算化哪个好 专科:会计电算化升本科的话可以升哪些专业 仙人球浇了太多水了,怎么办?在线等! 如果人喝太多水会怎么样?拜托了各位 谢谢 喝太多水是好处还是坏处。 水太多咋办 每天喝水太多要不要紧啊 寄韩国快递多少钱 从广东惠州寄包裹到韩国 需要多少钱一公斤、那个快递公司比较好? 请问江苏寄圆通快递50公斤到韩国要多少运费!或者有更好的快递! 青岛快递寄13斤到韩国要多少运费?