浅谈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 ...
随机推荐
- Gcc的编译流程分为了四个步骤:
http://blog.csdn.net/xiaohouye/article/details/52084770(转) Gcc的编译流程分为了四个步骤: 1.预处理,生成预编译文件(.文件): Gcc ...
- [问题2014S15] 复旦高等代数II(13级)每周一题(第十五教学周)
[问题2014S15] 设 \(O\) 为 \(n\) 阶正交阵,\(A=\mathrm{diag}\{a_1,a_2,\cdots,a_n\}\) 为实对角阵, 证明: 方阵 \(OA\) 的特征 ...
- windows中的程序放在linux上因为字符集不同出错
问题 在把windows下的一个python脚本挪到linux下的时候,出现了一个奇怪的问题,就是标题那样的报错,很明显,shell没有用对应的python解释器去解释脚本,而是直接用shell解释了 ...
- HTML 方法
姓名输入框:<input type="text" value="默认有值"/> 密码输入框:<input type="text&qu ...
- openurl 跳转
1.拨打电话: [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"tel://68979"]]; ...
- Flex http请求
下面类支持POST和GET请求,请求数据和出错将返回 package com.sole.util { import flash.events.Event; import flash.events.HT ...
- Linux shell中单引号,双引号及不加引号的简单区别
简要总结: 单引号: 可以说是所见即所得:即将单引号内的内容原样输出,或者描述为单引号里面看见的是什么就会输出什么. 双引号: 把双引号内的内容输出出来:如果内容中有命令,变量等,会先把变量,命令解析 ...
- spring,mybatis事务
概述事务管理对于企业应用来说是至关重要的,即使出现异常情况,它也可以保证数据的一致性.Spring Framework对事务管理提供了一致的抽象,其特点如下: 为不同的事务API提供一致的编程模型,比 ...
- oracle 之索引,同义词 ,关键词,视图 ,存储过程,函数,触发器
--创建索引 关键词 index create[unique] index index_name on table_name(column_name [,column_name…]) [tablesp ...
- combobox获取值
easyui-combobox是组合框 ,既可以输入,也可以选择 获取的数据是json格式的 [{"id":"001","text":&q ...