浅谈C#中的接口和抽象类
C#中接口为"其他方面互不相干"的类型提供公共的服务和特征;C#中class只支持但继承,使用接口却支持多继承,例如:C#中System.String是从System空间中的4个interface继承而来。
public sealed class String:ICompare,ICloneable,ICovertible,IEnumerable;C#中对class使用sealed关键字修饰,代表这个类不能够被在其他类继承。
接下来描述一下2者的区别:
1.两者表达的概念不一样,抽象类是一类事物的高度聚合,那么继承子类相对这个抽象类来说是一种"是"的关系,接口是定义行为的规范,因此实现接口的类相对于接口来说,"是行为需要按照接口来完成"。举个例子,花是所有花类的统称,牡丹是花,玫瑰是花,那么花相对牡丹和玫瑰来说是抽象类。而对于发出香味这一动作来说,香水也会发出香味。前者就是所说的抽象类,后者就是所说的接口。
2.抽象类在定义类型方法时候,可以给出实现部分,也可以不给出实现部分,而对于接口来说,其中所有的定义都不给出实现部分,例如:
public abstract DemoClass
{
public virtual void VirtualTest()
{
Console.WriteLine("This is a virtual function");
} public abstract void AbstractTest();
} public interface IDemoInterface
{
void InterFaceTest();
void InteFaceDemo();
}
3.继承类对于2者所涉及的方法的实现是不同的。继承类对于抽象类所定义的抽象方法可以不需要重写,也就是说可以沿用抽象类的 方法,而对于接口来说,定义的接口或者属性都必须在继承类中给出相应的实现。
4.由区别3可以得出,如果在抽象类中新增一个方法,继承类可以不需要做改变,但是如果在接口中新增了一个接口方法,必须在子类 中做相应的变化,实现新增的方法。
接下来,简单介绍一下接口相对于抽象类的优劣:
1.接口不光可以作用于引用类型也可以作用于值类型,抽象类只能作用于引用类型 ;
2..NET的类型只能实现单继承,但是接口可以实现多继承;
3.接口类只定义类属性和方法,而与真正的实现类没有太大关系,抽象类与继承类之间的关系就比较紧密了;
4.通过接口可以减少类型暴露的属性和方法,从而便可以保护类型对象,一个实现接口的类型,可能包含其他方法或者属性,但是方法 返回的时候,可以返回接口对象,这样,调用端只能通过接口提供的方法或者属性,访问对象的相关元素,这样可以有效保护对象的其 他元素;
5.减少值类型的拆箱操作。对于Struct定义的值类型数据,每从存放集合当中取出来,都需要进行拆箱操作,这时采用Struct+Interface 结合的方法,从而降低拆箱操作。
其实在继承中,到底使用接口还是抽象类。接口是固定的,约定俗成的,因此在继承类中必须提供接口相应的方法和属性的实现。而对于 抽象类来说,抽象类的定义方法的实现,贯穿整个继承树,因此其中方法的实现或者重写都是不确定的。因此相对而言,抽象类比接口更 灵活一些。
以下通过图表简单总结一下2者之间的差异:
浅谈C#中的接口和抽象类的更多相关文章
- 【总结】浅谈JavaScript中的接口
一.什么是接口 接口是面向对象JavaScript程序员的工具箱中最有用的工具之一.在设计模式中提出的可重用的面向对象设计的原则之一就是“针对接口编程而不是实现编程”,即我们所说的面向接口编程,这个概 ...
- 浅谈Java中接口与抽象类的异同
浅谈Java中接口与抽象类的异同 抽象类和接口这两个概念困扰了我许久,在我看来,接口与抽象类真的十分相似.期间也曾找过许许多多的资料,参考了各路大神的见解,也只能是简简单单地在语法上懂得两者的区别.硬 ...
- 浅谈JS中的!=、== 、!==、===的用法和区别 JS中Null与Undefined的区别 读取XML文件 获取路径的方式 C#中Cookie,Session,Application的用法与区别? c#反射 抽象工厂
浅谈JS中的!=.== .!==.===的用法和区别 var num = 1; var str = '1'; var test = 1; test == num //tr ...
- 浅谈Java中的深拷贝和浅拷贝(转载)
浅谈Java中的深拷贝和浅拷贝(转载) 原文链接: http://blog.csdn.net/tounaobun/article/details/8491392 假如说你想复制一个简单变量.很简单: ...
- 浅谈Java中的深拷贝和浅拷贝
转载: 浅谈Java中的深拷贝和浅拷贝 假如说你想复制一个简单变量.很简单: int apples = 5; int pears = apples; 不仅仅是int类型,其它七种原始数据类型(bool ...
- 浅谈Java中set.map.List的区别
就学习经验,浅谈Java中的Set,List,Map的区别,对JAVA的集合的理解是想对于数组: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),JAVA集合可以存储和操 ...
- Java基础学习总结(29)——浅谈Java中的Set、List、Map的区别
就学习经验,浅谈Java中的Set,List,Map的区别,对JAVA的集合的理解是想对于数组: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),JAVA集合可以存储和操 ...
- 浅谈Java中的equals和==(转)
浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new String("hello"); 2 String str ...
- 浅谈Linux中的信号处理机制(二)
首先谢谢 @小尧弟 这位朋友对我昨天夜里写的一篇<浅谈Linux中的信号处理机制(一)>的指正,之前的题目我用的“浅析”一词,给人一种要剖析内核的感觉.本人自知功力不够,尚且不能对着Lin ...
随机推荐
- 查看占用cpu和内存最多的进程
linux下获取占用CPU资源最多的10个进程,可以使用如下命令组合: ps aux|head -;ps aux|grep -v PID|sort -rn -k +|head linux下获取占用内存 ...
- XMLHttpRequest 加载进度
XMLHttpRequest 相关资料请移步这里直接查看,我这里就不在赘述: https://developer.mozilla.org/zh-CN/docs/Web/API/XMLHttpReque ...
- zabbix3.0.4 部署之八 (zabbix3.0.4 微信报警)
[root@sv-zabbix ~]# cat /usr/local/zabbix/share/zabbix/alertscripts/weixin.py #!/usr/bin/env python# ...
- window绝对路径与相对路径
绝对路径:是从盘符开始的路径,形如C:\windows\system32\cmd.exe相对路径:是从当前路径开始的路径,假如当前路径为C:\windows要描述上述路径,只需输入system32\c ...
- 【转】CentOS 6.5安装pyspider过程记录
原文地址:http://blog.sina.com.cn/s/blog_48c95a190102wczx.html 1.根据pyspider官方推荐的安装方法,使用pip命令直接安装pyspider ...
- PCA理论与实践
PCA作用: 降维,PCA试图在力保数据信息丢失最少的原则下,用较少的综合变量代替原本较多的变量,而且综合变量间互不相关,减少冗余以及尽量消除噪声. PCA数学原理: 设 是维向量 想经过线性变换 ...
- 51nod 1459 迷宫游戏(dij)
题目链接:51nod 1459 迷宫游戏 dij裸题. #include<cstdio> #include<cstring> #include<algorithm> ...
- 【堆栈应用一】一个数divided=几个最小质因数的乘积(时间复杂度On)
此算法由LQD提供
- spring随手笔记4:ref的属性
1.local属性 引用在同一个xml的bean 只能引用bean的id <bean id="HelloWord" class="com.ltf ...
- c#调用存储过程
存储过程(Stored Procedure)即用来存储数据表操作的一个过程,是把对数据表操作的方法存储到一起的一个对象,是存储在数据库中. 优点:1.降低网络传输数据量:通过存储过程的名称和参数传递即 ...