博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#接口-对接口的理解
阅读量:7200 次
发布时间:2019-06-29

本文共 1645 字,大约阅读时间需要 5 分钟。

我是通过此文章理解了接口,觉得非常实用,借来一用。

c#为什么要使用接口?通俗的讲,就是为了降低耦合度。给大家看一个我见过的很搞笑的例子。看看下面的程序:一个学校里边,有两种人:学生、老师。他们都要吃饭和睡觉。

1publicinterface I人

2{  
3    void 吃饭();  
4    void 睡觉();  
5}
6publicclass 学生:I人
7{  
8    publicvoid 吃饭()
9        { //去食堂吃饭 }
10    publicvoid 睡觉()
11        { //回寝室睡觉 }
12    //其他特有方法,比如泡妞、打游戏
13}
14publicclass 老师:I人
15{
16    publicvoid 吃饭()
17        { //回家吃饭 }
18    publicvoid 睡觉()
19        { //回家睡觉 }
20    //其它特有方法,比如为生儿育女传宗接代的历史使命努力等“不足为外人道也”的事情
21}
22publicclass 学校
23{
24    publicvoid 开饭(I人 ren)
25        { ren.吃饭(); }
26    publicvoid 放学(I人 ren)
27        { ren.睡觉(); }
28}
29

这里就用到了里氏代换原则,"开饭()"和"放学()"的参数都是人,那么这个地方如果换成学生和老师肯定也可以。

1I人 某学生 =new 学生();
2某学生.开饭();
3某学生.放学();

这样执行的结果就是学生回寝室吃饭。

1I人 某老师 =new 老师();

2某老师.开饭();  
3某老师.放学();

这样执行的结果就是老师回家吃饭。

    为什么要这样写呢?这样写有什么好处呢? 我在开饭的时候完全可以直接调用“学生.吃饭();”、“老师.吃饭();”。接着看,有一天,学校里来了第三种人,家长。 家长既不是去寝室睡觉也不是回家睡觉,而是旅馆睡觉,既不是去食堂吃饭也不是回家吃饭,而是去下馆子。 这个时候学校这个系统该怎么处理呢? 如果原来没有定义"I人"这个接口那就麻烦啦,所有用到人的地方代码都要改。 现在不一样了,我可以直接定义一个类:家长,这个类实现人这个接口就可以了。 好,看代码:

1publicclass 家长:I人

2{
3    publicvoid 吃饭()
4        { //下馆子 }
5    publicvoid 睡觉()
6        { //去旅馆睡觉 }
7    //其它特有方法,比如会见老师,晓之以钱,动之以利等等,不一而足
8}
在调用的时候不需要修改任何代码,还和原来一样:
I人 某家长=new 家长();
某家长.开饭();
某家长.放学();
轻松搞定家长的食宿问题! 这样一来学校来再多的客人都没关系啊,绝对可以应付自如,这也就是传说中的可扩展性!不知道大家看到这里是不是能够明白接口的作用。如果你还不明白,那么你把人这个接口去掉,自己写一个学校开饭和放学的类,然后再加一个家长这个新新人类进去,看看你的代码是什么样子的,再想一下在人口这么多的中国,万一哪天你的学校里来了成千上万个新新人类你该怎么办!
先声明一下,这个案例可不是我想出来的~~
然后我们就很好理解了,为什么用别人的东西要实现接口呢?很直接的一个原因是这样一来,编程的复杂度就可能会大大降低了,不是么?

里氏代换原则是什么?听起来很高深,不过我们也不是什么学院派,就不讲大道理了,直接拿个例子来说一下。

我们拿人和程序员举个例子。人是一个大类,程序员是继承自人的子类。看看这句话:人需要吃饭。这句话我们把“人”换成“程序员”,就是:程序员需要吃饭,这样换不会有什么问题。现在我们反过来,把“程序员可以用计算机写程序”里边的程序员换成“人”,就是:人可以用计算机写程序。这样就不一定正确了,否则问题可就大了,我们这些程序员只怕没得饭吃了。
这个就是里氏代换原则:使用父类的地方肯定可以用它的一个子类来替换掉,但是使用一个子类的时候用它的父类来替换就不一定正确了。

你可能感兴趣的文章
PHP教程:我们什么时候应该使用异常?
查看>>
我的友情链接
查看>>
搭建 vsftpd FTP服务器
查看>>
安全技术积累-搜索目标漏洞20163月
查看>>
python_day11_IO模型
查看>>
RAID1创建
查看>>
再谈可重入和线程安全
查看>>
hadoop2.6.0+zookeeper+hbase1.0.0环境搭建
查看>>
iscsi存储
查看>>
我的友情链接
查看>>
记忆流过 恰似少年
查看>>
【代码】c++堆的简单实现
查看>>
用 jQuery 取得 Div 的宽度与高度(Width, Padding, Border, Margin)
查看>>
rhce 第20题配置iscsi的客户端
查看>>
pdo
查看>>
Apache功能和网站的基础结构
查看>>
java参数传递
查看>>
ubuntu下tomcat监视运行进度方法
查看>>
JavaScript异步编程大冒险: Async/Await
查看>>
Linux启动或禁止SSH用户及IP的登录
查看>>