C#——接口的意义以及与抽象类的区别
接口的意义是什么呢?接口与抽象类又有什么区别?什么情况选择用接口?什么情况选择用抽象类?
接口的意义:
1、实际开发中的约束作用,继承接口的类必须实现接口规定的方法,方便多人开发中的协同,避免随意性。
2、低的耦合度,会给以后代码的扩展带来很多便利。
a.不用接口的代码:
public class Teacher { public void Write() { Console.WriteLine("老师在写作...."); } }
public class Student { public void Write() { Console.WriteLine("学生在写作...."); } }
public class Person
{
public void Wirte(Student stu) { stu.Write(); }
public void Wirte(Teacher tea) { tea.Write(); }
}
static void Main(string[] args)
{
Person p = new Person();
Student stu = new Student();
p.Wirte(stu);
Teacher tea = new Teacher();
p.Wirte(tea);
Console.ReadKey();
}
结果:
学生在写作....
老师在写作....
b.使用接口的代码:
interface IPerson { void Write(); }
public class Student : IPerson { public void Write() { Console.WriteLine("学生在写作...."); } }
public class Teacher : IPerson { public void Write() { Console.WriteLine("老师在写作...."); } }
static void Main(string[] args)
{
IPerson p;
p = new Student();
p.Write();
p = new Teacher();
p.Write();
Console.ReadKey();
}
结果:
学生在写作....
老师在写作....
注释:比较两种写法,不仅仅是少了几行代码的事情。接口利用了类的多态特性,隐藏了类的类型,所以使用的时候很方便,只需关注到底需要调用何种方法,其实这就是简单工厂的雏形(下一章介绍),这无疑给以后的代码扩展带来诸多便利。
接口与抽象类的区别:
1、接口和抽象类侧重点不一样。接口侧重的是实现某一种方法(动作)的实现。抽象类则更丰富些,不仅具有一般类的特性,描述某一对象是什么,拥有哪些属性,拥有什么方法,而且还具有接口的特性,按照约定来约束自己的子类。
2、接口和抽象类的应用情况不一样:如果用生动一点、形象一点的话来描述那就是,Man、Women、Child继承Person这个抽象类,都有眼睛、鼻子、耳朵等属性,还具有MakeNoise()的功能,这个时候用抽象类就很恰当。换另外一种情况举例说明接口,Car与上述的Man、Women、Child明显不属于一个种类,但是Car也有MakeNoise()的功能呀,这时候强行将Car继承Person, 你会发现这是多么的不恰当,因为Car无缘无故的拥有了不可能有的属性(眼睛、鼻子、耳朵等)。但是换接口呢?因为我们只要求实现MakeNoise()的功能,所以接口在此很适用。
注释:一个子类只能继承一个基类(抽象类)(正如人Car继承了它的父类Machine就不能继承Person一样),但是可以继承多个接口(MakeNoise、MakeCO2)。
需要注意的地方:
1、 接口是抽象类的变体,接口中所有的方法都是抽象的。而抽象类是声明方法的存在而不去实现它的类。
2、 接口可以多继承,抽象类不行
3、 接口定义方法,不能实现,而抽象类可以实现部分方法。
4、 接口中基本数据类型为static 而抽类象不是的。
写在最后:
当你关注一个事物的本质的时候,用抽象类。当你关注一个操作的时候,用接口。抽象类的功能要远超过接口,但是,定义抽象类的代价高。每个子类只能继承基类。在这个基类中,你必须编写出其所有子类共有的属性和方法。接口在功能上虽然弱化许多,但是它只是针对一个动作的描述。而且你可以在一个类中同时实现多个接口。在设计阶段降低了难度。
参考:接口和抽象类有什么区别、C#抽象类及其方法的学习、接口实例和类实例比较
C#——接口的意义以及与抽象类的区别的更多相关文章
- c# interface(接口)和abstract(抽象类)区别
抽象类依然是一个类,不能被实例化,可以包含字段.成员变量.抽象方法.或者不抽象方法. 类继承抽象类,只重写抽象方法即可,其他是可以得到继承的. 接口是规则,里面只包含:方法.属性.索引.事件.类继承接 ...
- java接口和抽象类的区别和作用(功能、用途、好处)
Java接口: 总结了4点关于JAVA中接口存在的意义: 1.重要性:在Java语言中, abstract class 和interface 是支持抽象类定义的两种机制.正是由于这两种机制的存在,才赋 ...
- C#—接口和抽象类的区别?
一.接口 接口是指对协定进行定义的引用类型,其他类型实现接口,以保证它们支持某些操作.接口指定必须由类提供的成员或实现它的其他接口.与类相似,接口可以包含方法.属性.索引器和事件作为成员. 1.接口存 ...
- 接口和抽象类的区别(不讲废话,干货满满,JDK1.8最新整理)
接口和抽象类的区别(不讲废话,干货满满,JDK1.8最新整理) 1.抽象类 以下说辞可能不太准确,但是会让你醍醐灌顶 抽象类是把一些具有共同属性(包括行为)的东西抽象出来,比如: 小狗有身高,体重,颜 ...
- android中接口和抽象类的区别
最近发现很多基础有点生疏了,特地写一点博客来巩固一下.今天主要来谈谈接口和抽象类的区别,我们在项目的很多地方都会用到接口或者抽象类,但是它们之间的一些区别和相同点不知道大家有没有注意到,还有就是,什么 ...
- c#接口与抽象类的区别
abstract 修饰符用于表示所修饰的类是不完整的,并且它只能用作基类.抽象类与非抽象类在以下方面是不同的: 抽象类不能直接实例化,并且对抽象类使用 new 运算符是编译时错误.虽然一些变量和值在编 ...
- Java接口和抽象类的区别
今天看到项目中,写了一个抽象类,里面有很多方法继承了这类,当调用这个接口时,采用的是这个抽象类去调方法的,当时一想,这个不就是我们说的Java的多态的特征: 继承:存在继承关系的子类和父类 重写:子类 ...
- C#接口和抽象类的区别
大家都容易把这两者搞混,我也一样,在听李建忠老师的设计模式时,他也老把抽象类说成接口,弄的我就更糊涂了,所以找了些网上的资料. 一.抽象类: 抽象类是特殊的类,只是不能被实例化:除 ...
- java 接口和抽象类的区别
java 接口和抽象类的区别抽象类:1.含有抽象方法的类一定为抽象类,反过来抽象类,不一定含有抽象方法:2.抽象类必须用abstract来进行定义,抽象方法也必须用abstract来进行定义:3.抽象 ...
随机推荐
- 微信小程序初探(二):阅读官方demo源码
阅读demo有助于理解逻辑,而且demo源码中应该包含了框架开发人员想要表达的意思的精华,先从app.js着手来阅读. 附带贴下说明: https://mp.weixin.qq.com/debug/w ...
- [poj2234]Matces Game_博弈论
Matches Game poj-2234 题目大意:n堆石子的Nim游戏,anti-SG. 注释:$1\le n\le 20$. 想法:用Colon定理即可.具体见:小约翰的游戏 最后,附上丑陋的代 ...
- [miniApp] WeChat user login code
in client/app.js, we put user login logic inside here, so that other module can reuse those code by ...
- VS2013大括号高亮显示的设置方法
在做公司一个项目的时候,需要用到VS2013编辑器,用了之后感觉有点不太爽. 在js文件里定义了方法之后,由于方法比较长,写完之后再回来看就有些不方便,尤其是方法里还有几个判断,后人再看的时候会有些不 ...
- Python&MySQL
环境:windows8+Python2.7+MySQL5.6 尝试过在C/C++中嵌入SQL语言,最终在其复杂"繁琐"环境配置中败下阵来,后来发现Python和MySQL比較eas ...
- ios 仿android gallery控件
ios 上没有发现与android gallery类似的控件,因为在项目上须要使用到.採用UICollectionView实现 watermark/2/text/aHR0cDovL2Jsb2cuY3N ...
- <感悟帖>互联网与电子传统行业之经历
依据鄙人浅显的实习.毕业工作经验以及个人思考得此文. 鄙人有幸在BAT中的B实习,以及某电子行业科研机构工作,略有心得.总结例如以下.也算是对自己的一个交待和反省. 鄙人小硕毕业211学校非985,C ...
- react State改变,页面却没有改变
react 小白编程 做项目时遇到了个问题,无论我怎么查看我的action.reducer 还是 dispatch 函数,都没有发现有什么毛病.但是 debugger 的时候,state 改变了,页面 ...
- iOS 中删除cookie的正确做法
需求:删除 qq 登录的 cookie,保证下次打开 qq 登录页面不会默认登录 实现: NSString *url =@"https://w.mail.qq.com/cgi-bi ...
- POJ 3221 Diamond Puzzle.
~~~~ 题目链接:http://poj.org/problem? id=3221 显然是BFS找最优解.但是终止条件不好写.看到有一仅仅队交上去一直TLE. 比赛完了看题解原来是以目标状态为起点,B ...